Google apps script 为什么我的onChange触发器执行多次,而不是在更改后执行一次。?
为什么我的OnChange触发器会触发多次?我创建了这段代码来生成pdf并通过电子邮件发送。为了自动运行它,我创建了一个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=
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(),则执行触发器….请告诉我如何写入这两个。。。。我会感谢你的。