Google Apps Script withSuccessHandler 运行 在函数完全执行之前
Google Apps Script withSuccessHandler is running before function fully executes
我在 Apps 脚本项目中有两个文件。一个是作为 "server" 的 .gs 文件,另一个是包含 JavaScript 的 .html 文件,符合 Google 的 Apps 脚本指南。
在这个项目的前 40 个小时的开发中,一切都进展顺利。在 .html 文件中的两个标记之间,我在任何函数之外都有以下代码行:
google.script.run.withSuccessHandler(setSheetData).getSheetData();
文档:https://developers.google.com/apps-script/guides/html/reference/run#withSuccessHandler(Function)
根据文档,getSheetData() 应首先在 .gs 文件中执行,然后 return 将一个值传递到 .html 文件中存在的 setSheetData。
服务器文件:
function getSheetData() {
var ss = SpreadsheetApp.getActive();
var activeSheet = ss.getActiveSheet();
var sheetName = activeSheet.getName();
var sheetVals = activeSheet.getDataRange().getValues();
return [sheetName, sheetVals];
}
Html 文件:
function setSheetData(data) {
alert(data);
sheetName = data[0];
sheetData = data[1];
headers = sheetData[0];
document.getElementById('sheetLook').innerHTML = 'Looking at sheet: ' + sheetName;
}
我怎么知道这是执行速度的问题:
目前 alert() 调用只打印出 null。它所绘制的 sheet 包含 4 行数据。但是,所有其他事情都保持不变,如果我只是查看具有 0-1 行数据的 sheet,它会正确地提醒整个数据值。
在 getSheetData() 内部,如果我添加 Logger.log(sheetVals),它会正确记录整个 sheet 的数据,无论大小如何。问题是 successhandler 正在执行 before 它有时间评估。
可能的原因:
- 数据第 3-4 行中的非法 return 值
- 不存在
active
sheet。
解决方案:
- 避免 returning 非法值,如
Date
对象。或者 JSON.stringify()
他们在 return 发送给客户之前。
getSheetByName
或数字而不是 active
ness.
参考文献:
我在 Apps 脚本项目中有两个文件。一个是作为 "server" 的 .gs 文件,另一个是包含 JavaScript 的 .html 文件,符合 Google 的 Apps 脚本指南。
在这个项目的前 40 个小时的开发中,一切都进展顺利。在 .html 文件中的两个标记之间,我在任何函数之外都有以下代码行:
google.script.run.withSuccessHandler(setSheetData).getSheetData();
文档:https://developers.google.com/apps-script/guides/html/reference/run#withSuccessHandler(Function)
根据文档,getSheetData() 应首先在 .gs 文件中执行,然后 return 将一个值传递到 .html 文件中存在的 setSheetData。
服务器文件:
function getSheetData() {
var ss = SpreadsheetApp.getActive();
var activeSheet = ss.getActiveSheet();
var sheetName = activeSheet.getName();
var sheetVals = activeSheet.getDataRange().getValues();
return [sheetName, sheetVals];
}
Html 文件:
function setSheetData(data) {
alert(data);
sheetName = data[0];
sheetData = data[1];
headers = sheetData[0];
document.getElementById('sheetLook').innerHTML = 'Looking at sheet: ' + sheetName;
}
我怎么知道这是执行速度的问题: 目前 alert() 调用只打印出 null。它所绘制的 sheet 包含 4 行数据。但是,所有其他事情都保持不变,如果我只是查看具有 0-1 行数据的 sheet,它会正确地提醒整个数据值。
在 getSheetData() 内部,如果我添加 Logger.log(sheetVals),它会正确记录整个 sheet 的数据,无论大小如何。问题是 successhandler 正在执行 before 它有时间评估。
可能的原因:
- 数据第 3-4 行中的非法 return 值
- 不存在
active
sheet。
解决方案:
- 避免 returning 非法值,如
Date
对象。或者JSON.stringify()
他们在 return 发送给客户之前。 getSheetByName
或数字而不是active
ness.