如何仅在我想要的工作表上输入新数据时才在 Google Apps 脚本中运行更改或编辑?



我的电子表格有 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 可安装触发器安装。

在这种情况下,我认为事件对象的changeTypesource可用于实现您的目标。当这反映到您的脚本时,它将变为如下。

修改后的脚本:

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实现目标的方法。

最新更新