这里有两个问题,我有一个相当复杂的电子表格,我需要移动列,并且需要永远更新查询,因为它将成为常规任务。我决定更新查询以使用列标题,希望它会更灵活。
我以为我使用下面的脚本在正确的轨道上,但它在表格中没有做任何事情
function getHeader(sheet, headings) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var headings = sheet.getDataRange().offset(0, 0, 1).getValues()[0];
}
这就是我在工作表中调用脚本的方式
=query(A:F,"select "&getHeader("Name")&" where "&getHeader("Role")&" contains 'Cook' ",0)
我已经使用下面的查询工作似乎运行良好,我有兴趣知道什么会更好的脚本或查询?
=query(A:E,"select "&char(64+match("Name",1:1,0))&" where "&char(64+match("Role",1:1,0))&" = 'Cook' ")
这是一个直接使用列名而不是索引的示例。
你需要三列Side1,Side2和Hypotenuse。我将我的表单命名为“斜边”。
您选择边的长度并计算该直角三角形的斜边。
function hypotenuse() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('hypotenuse');
var rg=sh.getDataRange();
var vA=rg.getValues();
for(var i=1;i<vA.length;i++) {
var vObj={};
for(var n=0;n<vA[i].length;n++){
vObj[vA[0][n]]=vA[i][n];
vObj[vA[0][n]+'idx']=vA[0].indexOf(vA[0][n])
}
vObj.Hypotenuse=Math.sqrt((vObj.Side1 * vObj.Side1) + (vObj.Side2 * vObj.Side2));
vA[i][vObj.Hypotenuseidx]=vObj.Hypotenuse.toFixed(2);
}
rg.setValues(vA);
}
基于内置函数的解决方案将比使用自定义函数的解决方案具有更好的性能。
无论如何,您的自定义函数的“主要问题”是它不返回值。请结帐https://developers.google.com/apps-script/guides/sheets/functions。
上面的链接示例
function DOUBLE(input) {
return input * 2;
}