繁体   English   中英

只有在我想要的工作表上输入新数据时,如何才能在 Google Apps 脚本中运行 onChange 或 onEdit?

[英]How can I run onChange or onEdit in Google Apps Script only when new data is entered on the sheet I want?

我有 3 张电子表格。 名称为 sheet1、sheet2、sheet3。 我有一个 function“onChange()”。 我在触发器上安装 onChange function。 我想运行 onChange function 如果只有在 sheet2 添加新行时。 但不能正常工作。 如果我写 sheet1 或 sheet2 或 sheet3 任何东西总是运行我的 onChange function。

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()的 function 已经安装为 OnChange 可安装触发器。

在这种情况下,我认为可以使用事件 object 的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 触发器重新安装到 function onChange
  • 对于您的脚本,我认为您也可以使用 e.source 的事件e.source而不是SpreadsheetApp.getActiveSpreadsheet()

参考:

添加:

关于您的以下评论,

感谢 Tanaike 帮助我。 如果用户向 sheet2 添加一行,则 onchange function 有效(仅更改 equlas oparator.= change ==)。实际上,另一个应用程序正在向 sheet2 添加一行。 如果我使用 1 个控件e.source.getActiveSheet().getSheetName() == "sheet2")工作但如果我使用第二个控件不触发onChange e.changeType.= "INSERT_ROW".

在当前阶段,根据您的情况,当手动插入行并使用不是 Google 电子表格服务 (SpreadsheetApp) 的表格 API 插入行时,可以使用 OnChange 触发器。 因此,根据您的评论,在您的情况下,我认为该行是使用 SpreadsheetApp 插入的。 如果我的理解是正确的,我想提出以下两种模式。

模式一:

在此模式中,您当前的onChange()脚本是从 function 调用的, actually another application is adding a row to sheet2 当您actually another application is adding a row to sheet2包含在onChange()的同一 Google Apps 脚本项目中,并且假设 function 名称为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)
}

模式二:

在此模式中,在您的脚本中插入行与 Sheets API actually another application is adding a row to sheet2 在这种情况下,您可以使用 batchUpdate 方法的 InsertDimensionRequest 转换插入行的脚本。 Ref运行此脚本时,可以使用我提出的脚本。 因为当使用表格 API 插入新行时,会触发 OnChange 触发器。 在这种情况下,我无法理解您的脚本actually another application is adding a row to sheet2 通过这个,我只是提出了使用表格 API 实现目标的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM