Google apps script Can';你不能让onEdit调用函数吗?

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次来测试它,这同样很慢)

我正在尝试连接两个电子表格,这样,我可以在一个电子表格上执行sumif函数,并在当前电子表格上得到结果。我在函数
上使用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);
  }