google 脚本中对服务器端函数的异步调用
Asynchronous call to server side function in google script
在我的 google 脚本网络应用程序中,我需要设计一个函数,从网页中获取数据,将其粘贴到 google sheet,生成一个基于this google sheet,然后通过电子邮件将其发送给用户。
到目前为止,我的程序是这样的:
该函数从网页中选取数据,它调用服务器端函数来更新 google sheet 中的值并发送 pdf。
Html 边:
function generateReport(){
data=getDataFromThePage()
google.script.run.updateTheSheetAndSendPdf(data)
}
服务器端(Google 应用程序脚本)
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 对应于先前记录在 google [=41= 中的值].
直到我第二次运行 generateReport() 时,正确的数据才最终进入pdf。
所以我得出的结论是函数 sendEmail 运行s "too early",甚至在 google sheet 更新之前
有人知道如何确保 google sheet 值在生成 pdf 之前得到更新吗?
提前致谢
通过在生成 pdf blob 之前添加 SpreadsheetApp.flush() 可以正常工作。它 "expedites" google sheet 的更新,以便使用最新值生成 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]
});
}
在我的 google 脚本网络应用程序中,我需要设计一个函数,从网页中获取数据,将其粘贴到 google sheet,生成一个基于this google sheet,然后通过电子邮件将其发送给用户。 到目前为止,我的程序是这样的:
该函数从网页中选取数据,它调用服务器端函数来更新 google sheet 中的值并发送 pdf。
Html 边:
function generateReport(){
data=getDataFromThePage()
google.script.run.updateTheSheetAndSendPdf(data)
}
服务器端(Google 应用程序脚本)
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 对应于先前记录在 google [=41= 中的值].
直到我第二次运行 generateReport() 时,正确的数据才最终进入pdf。
所以我得出的结论是函数 sendEmail 运行s "too early",甚至在 google sheet 更新之前
有人知道如何确保 google sheet 值在生成 pdf 之前得到更新吗?
提前致谢
通过在生成 pdf blob 之前添加 SpreadsheetApp.flush() 可以正常工作。它 "expedites" google sheet 的更新,以便使用最新值生成 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]
});
}