Google apps script 为什么我的onChange触发器执行多次,而不是在更改后执行一次。?

Google apps script 为什么我的onChange触发器执行多次,而不是在更改后执行一次。?,google-apps-script,Google Apps Script,为什么我的OnChange触发器会触发多次?我创建了这段代码来生成pdf并通过电子邮件发送。为了自动运行它,我创建了一个OnChange触发器。它运行良好,但执行多次。请帮忙 function emailPoaAsPDF() { var ss =SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1xEEEiLfil1qfetSwZRhr02Q9uoXvWtCxq22JywTu5mo/edit#gid=

为什么我的OnChange触发器会触发多次?我创建了这段代码来生成pdf并通过电子邮件发送。为了自动运行它,我创建了一个OnChange触发器。它运行良好,但执行多次。请帮忙

function emailPoaAsPDF() {

  var ss =SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1xEEEiLfil1qfetSwZRhr02Q9uoXvWtCxq22JywTu5mo/edit#gid=1872480652").getSheetByName("POA Temp");

  var email = ss.getRange("a37").getValue();
  var cc_email = "xxxxxx@gmail.com";
  var name = ss.getRange("a34").getValue();
  var sub = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx of "+ name;     
  var body = "Hello "+ name + ","
    + "xxxxxxxxxxxxxxxxxxxx"

  var url='https://docs.google.com/spreadsheets/d/1xEEEiLfil1qfetSwZRhr02Q9uoXvWtCxq22JywTu5mo/export?';
  var exportOptions =
   'exportFormat=pdf&format=pdf' +
   '&size=a4' + 
   '&scale=2' + 
   '&top_margin=1' +            
   '&bottom_margin=1' +         
   '&left_margin=1.25' +        
   '&right_margin=1.25' +
   '&portrait=true' + 
   '&fitw=false' + 
   '&sheetnames=false&printtitle=false' + 
   '&pagenumbers=false&gridlines=false' + 
   '&fzr=false' + 
   '&gid=1872480652';
  var params = {method:"GET",headers:{"authorization":"Bearer "+ 
  ScriptApp.getOAuthToken()}};
  var response = UrlFetchApp.fetch(url+exportOptions, params).getBlob();
  GmailApp.sendEmail(email, sub, body, {
  htmlBody: body,
  cc: cc_email,
  attachments: [{
    fileName: "xxx for " + ss.getRange("a34").getValue().toString() +".pdf",
    content: response.getBytes(),
    mimeType: "application/pdf"
   }]
  });
  var nameFile = ss.getRange("e7").getValue().toString() + " for " + 
  ss.getRange("a7").getValue().toString() +".pdf"
要指定仅在特定单元格中发生更改时才触发功能,请执行相应的条件语句 样品

函数emailPoaAsPDF(){
var ss=SpreadsheetApp.openByUrl(“https://docs.google.com/spreadsheets/d/1xEEEiLfil1qfetSwZRhr02Q9uoXvWtCxq22JywTu5mo/edit#gid=1872480652getSheetByName(“POA临时”);
var activeRange=ss.getActiveSheet().getActiveRange();
如果(activeRange.getA1Notation()=“A37”){
//执行代码的其余部分
}
}
根据您的情况(例如,如果值因
导入
公式而更改),单元格
A37
的更改可能不需要使其成为活动单元格

如果是这种情况,则需要采取更复杂的方法—在中保存旧值,并在条件语句中将新值与旧值进行比较

你也应该考虑你应该使用<代码> OnEdg/<代码>触发器,而不是<代码> OnChchange < /Cord>——这将使你访问<代码> Engest<<代码> >

有关更详细的示例,请参阅。

要指定仅当更改发生在特定单元格中时才触发功能,请执行相应的条件语句 样品

函数emailPoaAsPDF(){
var ss=SpreadsheetApp.openByUrl(“https://docs.google.com/spreadsheets/d/1xEEEiLfil1qfetSwZRhr02Q9uoXvWtCxq22JywTu5mo/edit#gid=1872480652getSheetByName(“POA临时”);
var activeRange=ss.getActiveSheet().getActiveRange();
如果(activeRange.getA1Notation()=“A37”){
//执行代码的其余部分
}
}
根据您的情况(例如,如果值因
导入
公式而更改),单元格
A37
的更改可能不需要使其成为活动单元格

如果是这种情况,则需要采取更复杂的方法—在中保存旧值,并在条件语句中将新值与旧值进行比较

你也应该考虑你应该使用<代码> OnEdg/<代码>触发器,而不是<代码> OnChchange < /Cord>——这将使你访问<代码> Engest<<代码> >



有关更详细的示例,请参阅。

我认为您的更改速度太快,其中一些更改会延迟执行。所有内容都会立即更新。您可能会同时执行多个更改。正如您的代码现在一样,它将在任何更改上运行—插入行、更改工作表名称、编辑/删除单元格内容、,更新某些公式等。如果这不是您想要的-请指定要运行此代码的更改类型?仅当
A37
的单元格内容发生变化时?@ziganotschka,仅当A37发生变化时为是。。请帮助我,我认为您的更改速度太快,其中一些更改会延迟执行。所有内容都会立即更新。您可能会同时执行多个更改。正如您的代码现在一样,它将在任何更改上运行-插入行、更改工作表名称、编辑/删除单元格内容、,更新某些公式等。如果这不是您想要的-请指定要运行此代码的更改类型?仅当
A37
的单元格内容发生变化时?@ziganotschka,仅当A37发生变化时为是。。请帮助你好,我尝试了所有可能的方式,但它不会触发电子邮件的活动范围的事情。你能更详细地帮助我吗?我想说的是,每当一个新的数据行添加到工作表中时,我希望电子邮件和pdf自动触发。无论何时添加新数据行,等待回复都是不同的,因为活动范围将不仅仅是一个单元格。您是指正在填充现有行还是插入新行?通过在
if
语句之前实现:
Logger.log(ss.getActiveSheet().getActiveRange().getA1Notation())来检查您的真实活动范围并查看结果。结果将插入新行。我的意思是:查看结果日志(查看->执行)。嘿,我一直在尝试各种可能的方法。。。什么都不管用。请告诉我这个…我怎么写这个代码。。如果单元格的值大于0,则应执行OnChange触发器。请注意,我们没有手动更改任何值……我想到的另一种方式是。。。。。如果插入的新行的时间戳等于now(),则执行触发器….请告诉我如何写入这两个。。。。我会很感激你的。你好,我尝试了所有可能的方法,但它不会触发电子邮件。你能更详细地帮助我吗?我想说的是,每当一个新的数据行添加到工作表中时,我希望电子邮件和pdf自动触发。无论何时添加新数据行,等待回复都是不同的,因为活动范围将不仅仅是一个单元格。您是指正在填充现有行还是插入新行?通过在
if
语句之前实现:
Logger.log(ss.getActiveSheet().getActiveRange().getA1Notation())来检查您的真实活动范围并查看结果。结果将插入新行。我的意思是:查看结果日志(查看->执行)。嘿,我一直在尝试各种可能的方法。。。什么都不管用。请告诉我这个…我怎么写这个代码。。如果单元格的值大于0,则应执行OnChange触发器。请注意,我们没有手动更改任何值……我想到的另一种方式是。。。。。如果插入的新行的时间戳等于now(),则执行触发器….请告诉我如何写入这两个。。。。我会感谢你的。