我的电子表格有 3 张纸。名称为工作表 1、工作表 2、工作表 3。我有一个函数"onChange()"。我在触发器上安装了更改功能。我想运行更改功能,如果仅在工作表 2 添加新行时。但无法正常工作。如果我写工作表 1 或工作表 2 或工作表 3,任何东西总是运行我的 onChange 函数。
function onChange(){
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet2");
var sheet2lr = ss.getRange(ss.getLastRow(),1,1,2).getValues();
var sheet1lr = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet1");
sheet1lr.getRange(getLastRow(),1,1,4).setValues(sheet2lr)}
我相信你的目标如下。
- 您希望在将新行插入"sheet2"时运行
onChange()
脚本。 - 您的
onChange()
函数已作为 OnChange 可安装触发器安装。
在这种情况下,我认为事件对象的changeType
和source
可用于实现您的目标。当这反映到您的脚本时,它将变为如下。
修改后的脚本:
function onChange(e) {
if (e.changeType != "INSERT_ROW" || e.source.getActiveSheet().getSheetName() != "sheet2") return; // Added
// do something
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet2"); // Or e.source.getSheetByName("sheet2");
var sheet2lr = ss.getRange(ss.getLastRow(), 1, 1, 2).getValues();
var sheet1lr = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet1"); // Or e.source.getSheetByName("sheet1");
sheet1lr.getRange(getLastRow(), 1, 1, 4).setValues(sheet2lr)
}
- 在此修改后的脚本中,当将新行插入到"sheet2"时,将运行 if 语句下的脚本。
- 当您要运行此脚本时,请在"Sheet2"的工作表中插入新行。
注意:
- 如果上述修改不起作用,请将 OnChange 触发器重新安装到函数
onChange
。 - 对于您的脚本,我认为您也可以使用
e.source
的事件对象而不是SpreadsheetApp.getActiveSpreadsheet()
。
参考:
- 事件对象
添加:
关于您的以下评论,
谢谢塔奈克帮助我。 如果用户向 Sheet2 添加一行,则 onchange 函数有效(仅更改 equlas oparator != 更改 ==)。实际上另一个应用程序正在向 sheet2 添加一行。当我使用 1 个控件
e.source.getActiveSheet().getSheetName() == "sheet2")
工作,但如果我使用第二个控件不触发onChange e.changeType != "INSERT_ROW".
在当前阶段,在您的情况下,当手动插入行并使用不是 Google 电子表格服务 (SpreadsheetApp) 的表格 API 插入行时,可以使用 OnChange 触发器。因此,从您的评论中,在您的情况下,我认为该行是用电子表格应用程序插入的。如果我的理解是正确的,我想提出以下两种模式。
模式 1:
在此模式中,您当前的onChange()
脚本是从actually another application is adding a row to sheet2
的函数调用的。当您的actually another application is adding a row to sheet2
脚本包含在onChange()
的同一Google Apps脚本项目中并且假定函数名称为sample()
时,您可以按如下方式进行修改。
function sample() {
// do something of `actually another application is adding a row to sheet2`
onChange();
}
function onChange(){
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet2");
var sheet2lr = ss.getRange(ss.getLastRow(),1,1,2).getValues();
var sheet1lr = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet1");
sheet1lr.getRange(getLastRow(),1,1,4).setValues(sheet2lr)
}
模式 2:
在此模式中,该行使用工作表 API 插入到actually another application is adding a row to sheet2
脚本中。在这种情况下,您可以使用批处理更新方法的插入维度请求转换用于插入行的脚本。引用 运行此脚本时,可以使用我建议的脚本。因为当使用工作表 API 插入新行时,将触发 OnChange 触发器。在这种情况下,我无法理解您的actually another application is adding a row to sheet2
脚本.通过这一点,我只是提出了使用Sheets API实现目标的方法。