![](/img/trans.png)
[英]How to run the following Google Apps Script function whenever new data is entered to Google Sheet?
[英]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)}
我相信你的目标如下。
onChange()
脚本。onChange()
的 function 已经安装为 OnChange 可安装触发器。 在这种情况下,我认为可以使用事件 object 的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)
}
onChange
。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.