首页 > 解决方案 > 为什么我的 onChange 触发器在更改后执行多​​次而不是一次。?

问题描述

为什么我的 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"

标签: google-apps-script

解决方案


要指定仅当更改发生在特定单元格中时才触发功能 - 实现相应的条件语句

样本

function emailPoaAsPDF() {
  var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1xEEEiLfil1qfetSwZRhr02Q9uoXvWtCxq22JywTu5mo/edit#gid=1872480652").getSheetByName("POA Temp");
  var activeRange = ss.getActiveSheet().getActiveRange();
  if( activeRange.getA1Notation() == "A37"){
  // execute the rest of the code
  }
}

根据您的情况(例如,如果值因ImportRange公式而更改),A37可能不需要更改单元格使其成为活动单元格。

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

您还应该考虑是否可以使用onEdit触发器而不是onChange- 这将使您可以访问事件对象 e.range

有关更详细的示例,请参见此处。


推荐阅读