对谷歌脚本中服务器端函数的异步调用



在我的谷歌脚本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]     
});  
}

相关内容

  • 没有找到相关文章

最新更新