首页 > 解决方案 > 仅在更改链接的工作表的一个单元格时触发书面功能

问题描述

我有一个为每个人提供免费饮食的网页。这些饮食会根据您的体重、年龄、性别而变化……所以,为了(通过邮件和 PDF 格式)发送正确的饮食,我需要更改表格的一些参数。

我尝试过单次触发(onedit),但是由于包含参数时许多单元格发生了变化,因此该函数运行了太多次,甚至崩溃了发送电子邮件。

所以,我需要在只更改一个单元格时触发该功能。我正在使用函数 sendSheetToPdfwithA1MailAdress (感谢开发人员)

下面是整个代码。有人可以帮我触发整个功能吗?

function sendSheetToPdfwithA1MailAdress(){ // this is the function to call
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheets()[0]; // it will send sheet 0 which is the first sheet in the spreadsheet.
  // if you change the number, change it also in the parameters below
  var shName = sh.getName()
  sendSpreadsheetToPdf(0, shName, sh.getRange('h1').getValue(),"test email with the address in cell A1 ", "This is it !");
}
function sendSpreadsheetToPdf(sheetNumber, pdfName, email,subject, htmlbody) {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheetId = spreadsheet.getId()  
  var sheetId = sheetNumber ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;  
  var url_base = spreadsheet.getUrl().replace(/edit$/,'');

  var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf

      + (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId)) 
      // following parameters are optional...
      + '&size=A4'      // paper size
      + '&portrait=true'    // orientation, false for landscape
      + '&fitw=true'        // fit to width, false for actual size
      + '&sheetnames=true&printtitle=false&pagenumbers=true'  //hide optional headers and footers
      + '&gridlines=false'  // hide gridlines
      + '&fzr=false';       // do not repeat row headers (frozen rows) on each page

  var options = {
    headers: {
      'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken(),
    }
  }

  var response = UrlFetchApp.fetch(url_base + url_ext, options);
  var blob = response.getBlob().setName(pdfName + '.pdf');
  if (email) {
    var mailOptions = {
      attachments:blob, htmlBody:htmlbody
    }
MailApp.sendEmail(
      email, 
      subject+" (" + pdfName +")", 
      "html content only", 
      mailOptions);

MailApp.sendEmail(
      Session.getActiveUser().getEmail(), 
      "FRWD "+subject+" (" + pdfName +")", 
      "html content only", 
      mailOptions);
  }
}

标签: google-apps-scriptgoogle-sheetstriggerscell

解决方案


如果您希望在修改一个单元格时触发脚本,则可以使用以下 if 条件:

onEdit(e){
// your code
  if(e.range.getValues().length ==1){
  // the code you want to run when a single cell is changed
  }
}

这将检查修改了多少单元格,如果只更改了一个单元格,它将运行其余的代码。

编辑

根据您在评论中提供的信息,我了解您想知道 A1 是否已更改,在这种情况下,请使用以下代码:

onEdit(e){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheets()[0]; 
  var shName = sh.getName();
   if(e.range.getA1Notation()=='A1'){
      sendSpreadsheetToPdf(0, shName, sh.getRange('h1').getValue(),"test email with the       adress in cell A1 ", "This is it !");   
   }
}

参考


推荐阅读