Google apps script Can';你不能让onEdit调用函数吗?
我正在尝试连接两个电子表格,这样,我可以在一个电子表格上执行sumif函数,并在当前电子表格上得到结果。我在函数Google apps script Can';你不能让onEdit调用函数吗?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在尝试连接两个电子表格,这样,我可以在一个电子表格上执行sumif函数,并在当前电子表格上得到结果。我在函数上使用onEdit installable触发器,因为简单的触发器不起作用。Dependent下拉列表和sumif通过for循环工作,但我似乎无法在调用函数sum以设置单元格上的值时获取函数。sum函数单独工作并给出结果,但当执行onEdit时,它不会。 另外,这是执行sumif的正确方法吗?有没有更快的方法(我需要执行大约600-1000次,这里我只保留了10次来测试它,这同样很慢)
上使用onEdit installable触发器,因为简单的触发器不起作用。Dependent下拉列表和sumif通过for
循环工作,但我似乎无法在调用函数sum
以设置单元格上的值时获取函数。sum函数单独工作并给出结果,但当执行onEdit时,它不会。
另外,这是执行sumif的正确方法吗?有没有更快的方法(我需要执行大约600-1000次,这里我只保留了10次来测试它,这同样很慢)
我的代码如下:
'''
var ss=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var stck=SpreadsheetApp.openById(“1WGbEo1Xr99HwHY_4zaetriccouncjvfqczzx4dcqx4i”);
var unisensor=stck.getSheetByName(“unisensor”);
var ssOptions=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“产品列表”);
var options1=ssOptions.getRange(2,1,ssOptions.getLastRow()-1,2.getValues();
当(e)时的函数{
var-activeCell=e.range;
var val=activeCell.getValue();
var r=activeCell.getRow();
var c=activeCell.getColumn();
var ssName=activeCell.getSheet().getName();
如果(ssName==“股票”&&r==2&&c==1){
getRange(r,2).clearContent();
getRange(r,2).clearDataValidations();
var filteredOptions=options1.filter(函数(o){returno[0]==val});
var listToApply=filteredOptions.map(函数(o){returno[1]});
console.log(listToApply);
var cell=ss.getRange(r,2);
applyValidationToCell(listToApply,cell);
}
如果(ssName==“股票”&&r==2&&c==2){
var company=ss.getRange(r,1);
如果(公司==“Unisensor”){
总和(val);
}
}
}
函数applyValidationToCell(列表,单元格){
var规则=电子表格应用程序
.newDataValidation()
.RequiremeEinList(列表)
.setAllowInvalid(false)
.build();
cell.setDataValidation(规则);
}
函数和(val){
var-res=0;
var结果=ss.getRange(2,3);
对于(i=4;iIf当(e)
执行时没有错误,但未调用sum()
时,这意味着如果未满足条件,则执行
通过执行以下日志进行故障排除:
在(e)时的功能{
var-activeCell=e.range;
var val=activeCell.getValue();
var r=activeCell.getRow();
var c=activeCell.getColumn();
var ssName=activeCell.getSheet().getName();
如果(ssName==“股票”&&r==2&&c==1){
getRange(r,2).clearContent();
getRange(r,2).clearDataValidations();
var filteredOptions=options1.filter(函数(o){returno[0]==val});
var listToApply=filteredOptions.map(函数(o){returno[1]});
console.log(listToApply);
var cell=ss.getRange(r,2);
applyValidationToCell(listToApply,cell);
}
如果(ssName==“股票”&&r==2&&c==2){
log('if(ssName==“Stock”&&r==2&&c==2)'
var company=ss.getRange(r,1);
如果(公司==“Unisensor”){
console.log('company==“Unisensor”')
总和(val);
}
否则{
console.log('notcompany==“Unisensor”')
}
}
否则{
log('notif(ssName==“Stock”&&r==2&&c==2)'
}
}
函数在onEdit
trigger上执行后-查看日志。感谢您的回答。尽管该单元格中的值与条件中的值相同,但似乎未满足if
条件。我不知道为什么是这种方式,您有想法吗?这也是执行sumif函数的正确方式吗?Wh两个if
条件中的一个?第二个if
条件:给我结果:notcompany==“Unisensor”
没关系。我想我必须使用getValue()
。非常感谢@ziganotschka
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var stck = SpreadsheetApp.openById("1WGbEo1Xr99HwHY_4ZaeTRIgCOuNcjVfqCzZx4dcQX4I");
var unisensor = stck.getSheetByName("Unisensor");
var ssOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Product List");
var options1 = ssOptions.getRange(2,1,ssOptions.getLastRow() - 1,2).getValues();
function When(e){
var activeCell = e.range;
var val = activeCell.getValue();
var r = activeCell.getRow();
var c = activeCell.getColumn();
var ssName = activeCell.getSheet().getName();
if (ssName=="Stock" && r==2 && c==1){
ss.getRange(r,2).clearContent();
ss.getRange(r,2).clearDataValidations();
var filteredOptions = options1.filter(function(o){return o[0] === val});
var listToApply = filteredOptions.map(function(o){return o[1]});
console.log(listToApply);
var cell = ss.getRange(r,2);
applyValidationToCell(listToApply,cell);
}
if (ssName=="Stock" && r==2 && c==2){
var company = ss.getRange(r,1);
if(company ==="Unisensor"){
sum(val);
}
}
}
function applyValidationToCell(list,cell){
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule);
}
function sum(val){
var res = 0;
var result = ss.getRange(2,3);
for (i =4;i<=10;i++){
var cell = unisensor.getRange(i,3).getValue();
var cellres = unisensor.getRange(i,9).getValue();
if( cell == val){
res+= cellres;
}
}
result.clearContent();
result.setValue(res);
Logger.log(res);
}