首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当新数据被输入到我想要的工作表上时,我如何在Google脚本中运行onChange或onEdit?

当新数据被输入到我想要的工作表上时,我如何在Google脚本中运行onChange或onEdit?
EN

Stack Overflow用户
提问于 2021-05-31 01:31:52
回答 1查看 608关注 0票数 0

我有3张电子表格。名字是sheet1,sheet2,sheet3。我有一个函数"onChange()“。我在触发器上安装了onChange函数。如果仅当在onChange上添加新行时,我希望运行sheet2函数。但工作不正常。如果我编写了sheet1、sheet2或sheet3,那么任何东西都会运行我的onChange函数。

代码语言:javascript
运行
复制
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)}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-31 03:02:04

我相信你的目标如下。

  • 当新行插入到“onChange()”时,您希望运行sheet2脚本。
  • 您的onChange()函数已经作为OnChange可安装触发器安装。

在这种情况下,我认为可以使用事件对象的changeTypesource来实现目标。当这反映到您的脚本中时,如下所示。

修改脚本:

代码语言:javascript
运行
复制
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 != 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()时,您可以修改如下。

代码语言:javascript
运行
复制
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实现您的目标的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67767027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档