google-apps-script - 为什么我的 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"
解决方案
要指定仅当更改发生在特定单元格中时才触发功能 - 实现相应的条件语句
样本
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
。
有关更详细的示例,请参见此处。
推荐阅读
- r - 如何在ggplot中只标记一个方面
- string - 访问查询表达式:在其他两个词之间提取词
- javascript - 根据输入的数字是否大于、小于或等于动态生成 if-else
- php - 人口统计报告设置已启用,但未捕获年龄和性别信息
- python - Django查询集在使用选择相关时没有属性
- visual-studio-code - 样式属性在 .vue 文件中没有建议
- python-3.x - 是否可以在 HTML 表中移动并使用 BeautifulSoup4 获取数据?
- java - Java(FX) 在播放一种声音时,播放另一种声音
- reactjs - 如何使用 Reactjs 将输入附加到 axios 调用端点
- python - Django REST Framework:如何向使用直通表的 M2M 序列化程序添加外主键?