当前位置: 首页 > 知识库问答 >
问题:

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

贺飞
2023-03-14

我有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)}

共有1个答案

薄鸿远
2023-03-14

我相信你的目标如下。

  • 当新行插入到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语句下面的html" target="_blank">脚本。
  • 当您要运行此脚本时,请在Sheet2的工作表中插入新行。
  • 如果上述修改无效,请将OnChange触发器重新安装到函数OnChange
  • 对于您的脚本,我认为您还可以使用e.source的事件对象,而不是SpreadsheetApp。getActiveSpreadsheet()
  • 事件对象

关于你下面的评论,,

谢谢塔奈克的帮助。如果用户向sheet2添加一行,onchange函数将起作用(仅更改Equals运算器!=更改==)。实际上,另一个应用程序正在向sheet2添加一行。当我使用1控件e.source时。getActiveSheet()。getSheetName()=“sheet2”)正在工作,但如果使用第二个控件,则不会触发onChange e e.changeType!=“插入_行”

在当前阶段,在您的情况下,当手动插入行并且使用非Google电子表格服务(SpreadsheetApp)的Sheets API插入行时,可以使用OnChange触发器。所以从你的评论,在你的情况下,我认为这一行插入了SpreadsheetApp。如果我的理解是正确的,我想提出以下2种模式。

在这个模式中,当前的onChange()脚本是从的函数调用的,实际上另一个应用程序正在向sheet2添加一行。当您的脚本实际上是另一个应用程序在Sheet2中添加一行时,它包含在同一个Google Apps Script项目的onChange()中,并且它假设函数名是same(),您可以修改为如下。

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,实际上另一个应用程序正在向sheet2添加一行。在这种情况下,可以使用batchUpdate方法的InsertDimensionRequest转换用于插入行的脚本。Ref运行此脚本时,可以使用我建议的脚本。因为当使用Sheets API插入新行时,将触发OnChange触发器。在这种情况下,我无法理解您的脚本,实际上另一个应用程序正在向sheet2添加一行。通过本文,我仅提出了使用Sheets API实现目标的方法。

 类似资料:
  • 问题内容: 我想设置一个cron作业来运行python脚本,但是它给了我这个错误: 这是因为我导入了一个需要打开显示的模块(例如)。即使我的脚本不会生成任何图片来显示在监视器上。 有什么方法可以让crontab在显示打开的情况下运行我的作业(就像我进入机器一样)?我实际上不需要为监视器生成任何图形。我只需要正确导入模块即可。 问题答案: 您将需要有效的DISPLAY和XAUTHORITY才能在Cr

  • 问题内容: 为什么在Hibernate中需要事务才能进行只读操作? 以下事务是否在数据库中设置了锁定? 从数据库获取示例代码: 我可以 代替使用吗? 问题答案: 您实际上可能有理由将事务标记为只读。 阅读交易看起来确实很奇怪,在这种情况下,人们通常不会标记交易方法。但是JDBC仍然会创建事务,只是如果未显式设置其他选项,它将可以正常工作。 但是,不能保证您的方法不会写入数据库。如果将method标

  • 我刚刚安装了rails 4.2。我找到了制作快速博客的教程:https://www.reinteractive.net/posts/32-ruby-on-rails-3-2-blog-in-15-minutes-step-by-step。但是,它使用rails 3.2。我已经完成了rake db:migrate之前它所说的一切,但是,当我运行服务器时,我只得到一个错误页面。自3.2以来发生了什么变

  • 如何获取小数点后仅两位数的双倍值。如果我的身高输入为72,体重为170,则收到的输出给出BMI=23.053626543209877。我不知道如何去掉.05后的尾随数字

  • 问题内容: 我正在编写一个python脚本,该脚本可以检查各种条件并相应地运行powershell脚本,以帮助我自动完成从Windows XP到Windows 7的迁移。powershell脚本提供了自己的输出,可让用户了解发生的情况。我想获取powershell脚本的输出并将其打印为python脚本的输出。我环顾了一些问题,这些问题似乎想做同样的事情,但似乎对我没有帮助。最初我尝试使用 如此处的

  • 在IBMConnections4.0和4.5中,我试图让一个定制Java应用程序模拟活动应用程序的大部分活动流行为。 Java代码使用Social Business Toolkit发布到活动流,并作为有权发布到其他用户流的用户进行身份验证,但我还在Firefox中使用RESTClient进行测试,同时作为同一个特殊用户登录。 活动应用程序有时会做以下事情,我不知道该怎么做: 发布到用户的“我的通知