在我的谷歌脚本web应用程序中,我需要设计一个函数,从网页中提取数据,将其粘贴到谷歌表单中,根据该谷歌表单生成pdf,然后通过电子邮件发送给用户。到目前为止,我的程序是这样的:
该函数从网页中提取数据,调用服务器端函数更新谷歌表单中的值并发送pdf。
Html侧:
function generateReport(){
data=getDataFromThePage()
google.script.run.updateTheSheetAndSendPdf(data)
}
服务器端(谷歌应用程序脚本(
function updateTheSheetAndSendPdf(data){
var reportSheet=SpreadsheetApp.openById(REPORT_ID).getSheetByName('report');
reportSheet.getRange(34,2,10,24).clearContent()
for (var i=0;i<data.length;i++){
for (param in data[i]){
if (data[i][param].c!=null){
reportSheet.getRange(data[i][param].c[0],data[i][param].c[1]).setValue(data[i][param].p)
}
}
}
var email = data.user;
var subject = "your PDF extract";
var blob = DriveApp.getFileById(REPORT_ID).getAs("application/pdf");
blob.setName("yourReport.pdf");
if (MailApp.getRemainingDailyQuota() > 0)
GmailApp.sendEmail(email, subject, body, {
htmlBody: body,
noReply:true,
attachments:[blob]
});
}
问题是,出于某种原因,当我运行generateReport((函数时,我通过电子邮件收到的pdf与谷歌表单中记录的值PREVIOSLY相对应。
只有当我第二次运行generateReport((时,正确的数据才最终进入pdf。
因此,我得出的结论是,在谷歌表单更新之前,sendEmail功能运行得"太早">
有人知道如何确保在生成pdf之前更新谷歌表单值吗?
提前感谢
在生成pdf blob之前添加SpreadsheetApp.flush((可以很好地工作。它"加速"谷歌表单的更新,以便使用最新的值生成pdf。感谢Tanaike提供的此解决方案。
服务器端(html端保持不变(:
function updateTheSheetAndSendPdf(data){
var reportSheet=SpreadsheetApp.openById(REPORT_ID).getSheetByName('report');
reportSheet.getRange(34,2,10,24).clearContent()
for (var i=0;i<data.length;i++){
for (param in data[i]){
if (data[i][param].c!=null){
reportSheet.getRange(data[i][param].c[0],data[i][param].c[1]).setValue(data[i][param].p)
}
}
}
var email = data.user;
var subject = "your PDF extract";
SpreadsheetApp.flush()
var blob = DriveApp.getFileById(REPORT_ID).getAs("application/pdf");
blob.setName("yourReport.pdf");
if (MailApp.getRemainingDailyQuota() > 0)
GmailApp.sendEmail(email, subject, body, {
htmlBody: body,
noReply:true,
attachments:[blob]
});
}