Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 只有在需要的工作表中输入新数据时,我如何才能在Google Apps脚本中运行onChange或OneEdit?_Javascript_Google Apps Script_Google Sheets_Triggers - Fatal编程技术网

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

Javascript 只有在需要的工作表中输入新数据时,我如何才能在Google Apps脚本中运行onChange或OneEdit?,javascript,google-apps-script,google-sheets,triggers,Javascript,Google Apps Script,Google Sheets,Triggers,我有3张电子表格。姓名是sheet1、sheet2、sheet3。我有一个函数“onChange()”。我在触发器上安装onChange函数。我想要运行onChange函数,只要在sheet2添加新行。但工作不正常。如果我写sheet1、sheet2或sheet3,任何东西都会运行onChange函数 function onChange(){ var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet2&qu

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

我相信你的目标如下

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)
}
  • 当新行插入到“sheet2”时,您希望运行
    onChange()
    的脚本
  • 您的
    onChange()
    函数已作为onChange可安装触发器安装
在本例中,我认为事件对象的
changeType
source
可以用于实现您的目标。当这反映到脚本中时,它将变成如下所示

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)
}
修改脚本:
  • 在这个修改后的脚本中,当新行插入到“sheet2”时,将运行if语句下面的脚本
  • 如果要运行此脚本,请在“Sheet2”的工作表中插入新行
注:
  • 如果上述修改无效,请将OnChange触发器重新安装到函数
    OnChange
  • 对于您的脚本,我认为您还可以使用
    e.source
    的事件对象,而不是
    SpreadsheetApp.getActiveSpreadsheet()
参考:
补充: 关于你下面的评论,

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

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

模式1: 在此模式中,当前的
onChange()
脚本是从
函数调用的,实际上另一个应用程序正在向sheet2添加一行。当您的
脚本实际上是另一个应用程序正在向sheet2添加一行时,它包含在同一个谷歌应用程序脚本项目
onChange()
中,并且假定函数名为
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:
在这种模式中,该行在
脚本中插入了Sheets API,实际上另一个应用程序正在向sheet2添加一行。在这种情况下,可以使用batchUpdate方法的InsertDimensionRequest转换用于插入行的脚本。运行此脚本时,可以使用我建议的脚本。因为当使用Sheets API插入新行时,将触发OnChange触发器。在这种情况下,我无法理解您的
脚本,实际上另一个应用程序正在向sheet2添加一行。通过这一点,我提出了使用Sheets API实现您目标的方法。

@Ahmet Hazin为了您的回复,我更新了我的答案。你能确认一下吗?如果这不是你期望的方向,我很抱歉。在这个阶段,我想我会用模型2找到一个解决方案。所以我需要学习一些关于sheet api的信息。