我有3张电子表格。名字是sheet1,sheet2,sheet3。我有一个函数"onChange()“。我在触发器上安装了onChange函数。如果仅当在onChange上添加新行时,我希望运行sheet2函数。但工作不正常。如果我编写了sheet1、sheet2或sheet3,那么任何东西都会运行我的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)}发布于 2021-05-31 03:02:04
我相信你的目标如下。
onChange()”时,您希望运行sheet2脚本。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)
}注意:
onChange函数中。e.source的事件对象,而不是SpreadsheetApp.getActiveSpreadsheet()。参考资料:
添加:
关于你下面的评论,
谢谢你帮我。如果用户向sheet2添加一行,onchange函数可以工作(只更改equlas != change ==).actually --另一个应用程序正在向sheet2添加一行。当我使用1控件
e.source.getActiveSheet().getSheetName() == "sheet2")工作时,如果我使用第二个控件,则不触发onChange e.changeType != "INSERT_ROW".
在当前阶段,在您的情况下,可以使用OnChange触发器,当行是手动插入的,行是用Sheets API插入的,而不是(SpreadsheetApp)。因此,根据您的评论,在您的情况下,我认为行是用SpreadsheetApp插入的。如果我的理解是正确的,我想提出以下两种模式。
模式1:
在此模式中,onChange()的当前脚本是从actually another application is adding a row to sheet2函数调用的。当您的actually another application is adding a row to sheet2脚本包含在onChange()的同一个Google脚本项目中,并且假设函数名为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:
在这种模式中,行是在actually another application is adding a row to sheet2脚本中插入Sheets的。在这种情况下,您可以使用InsertDimensionRequest的batchUpdate方法来转换插入行的脚本。参考在运行此脚本时,可以使用我建议的脚本。因为当使用Sheets插入新行时,会触发OnChange触发器。在这种情况下,我无法理解您的actually another application is adding a row to sheet2脚本。通过这个,我只是提出了使用Sheets实现您的目标的方法。
https://stackoverflow.com/questions/67767027
复制相似问题