google-apps-script - 仅在更改链接的工作表的一个单元格时触发书面功能
问题描述
我有一个为每个人提供免费饮食的网页。这些饮食会根据您的体重、年龄、性别而变化……所以,为了(通过邮件和 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);
}
}
解决方案
如果您希望在仅修改一个单元格时触发脚本,则可以使用以下 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 !");
}
}
参考
推荐阅读
- mysql - MySQL JSON 通配符
- google-app-engine - appengine.googleapis:method() 只需要 1 个参数(给定 2 个)
- android - 如何从使用 getIntent() 接收数据的活动发送数据?
- android - 没有数据返回时如何清除我的 Firebase ListView?
- r - 我的第一个 R Shiny,我如何将 selectinput 与 renderplot(ggplot) 结合起来?
- reactjs - 每次我在我的应用程序中更改页面时,Redux Store 的大小都会增长吗?
- javascript - TypeError: undefined is not an object (评估 '$next[0].offsetWidth')
- c - C 编程错误:结构的未定义符号(Keil 错误 L6218E)
- node.js - 设置音频。当前时间;带有从快递服务器发送的歌曲缓冲区
- pandas - 熊猫中特定列值的日期之间的累积差异