Pet*_*r D 5 google-sheets google-apps-script
对于 Google 电子表格可以使用的 Apps 脚本库中的内容是否有限制?具体来说,一个库可以包含一个 HTML 对话框吗?
我创建了一个电子表格脚本,该脚本添加了一个菜单项以向用户显示一个对话框。它用
HtmlService.createHtmlOutputFromFile('mappingForm').setSandboxMode(HtmlService.SandboxMode.IFRAME)
如https://developers.google.com/apps-script/guides/html/communication 中所述。HTML 文件包括带有 jQuery 的 HTML、CSS 和 JavaScript。它用于使用google.script.run电子表格中的数据填充对话框并向其提交表单。
这在原始电子表格中一切正常。
但是,我需要多个电子表格才能使用相同的代码,因此我尝试遵循跨电子表格(而不是库)共享的Google 电子表格脚本的总体思路,以拥有一个带有电子表格模板和多个副本的主脚本。
我按照https://developers.google.com/apps-script/guide_libraries上的说明从原始电子表格创建了一个库。当另一个电子表格使用该库时,我能够显示对话框,但是所有对服务器的调用(填充对话框或提交表单)都会失败,并在浏览器端google.script.run.withFailureHandler作为Error对象捕获错误有属性:
message: "We're sorry, a server error occurred. Please wait a bit and try again."
name: "ScriptError"
Run Code Online (Sandbox Code Playgroud)
我在应用程序脚本中放置了 Logger 调用,以查看是否正在调用服务器端函数,但没有调用它们。脚本编辑器的执行脚本显示:
[14-12-27 19:38:05:340 PST] 开始执行
[14-12-27 19:38:05:372 PST] 执行失败:很抱歉,发生服务器错误。请稍等,然后重试。[0.0 秒总运行时间]
客户端正在拨打电话,但在到达电子表格脚本之前出现故障。
这让我想知道是否
在此先感谢您的任何建议。
通过执行以下操作,我能够拥有一个包含 HTML 对话框的工作库。
将脚本和 HTML 文件从原始电子表格移至独立脚本项目。在File > Project properties...的Info选项卡中记下库的Project 键。任何打算使用该库的电子表格都需要它。
如果其他人要使用独立脚本项目,请单击其“共享”按钮以使其可与任何有链接的人共享,否则将无声地失败。
如果 HTML 对话框需要回调库函数(以获取或提交数据),则库函数必须存在于使用该库的电子表格中,否则您将在浏览器的 JavaScript 控制台中收到错误消息。
在使用库的电子表格中:Tools > Script editor... 单击Resources > Libraries...。在“包含的库”对话框中,在“查找库”文本框中输入独立项目的密钥,单击“选择”,然后选择适当的“版本”,更改标识符(如有必要)并保存。该标识值创建的电子表格的脚本中使用调用库函数同名的对象。就我而言,它是SignupFormResponsesSheet.
在同一个脚本编辑器的代码编辑器中,添加调用库函数的包装函数,包括将从 HTML 对话框回调的任何函数。我的库有一个onOpen()创建两个菜单项来显示 HTML 对话框,所以我添加了
function onOpen() {
SignupFormResponsesSheet.onOpen();
}
function showMappingForm() {
SignupFormResponsesSheet.showMappingForm();
}
function showSubmitForm() {
SignupFormResponsesSheet.showSubmitForm();
}Run Code Online (Sandbox Code Playgroud)
function runSignupFormResponseFunction(funcName, varargs) {
return SignupFormResponsesSheet[funcName].apply(this,
Array.prototype.slice.call(arguments, 1));
}Run Code Online (Sandbox Code Playgroud)
runSignupFormResponseFunction。例如,它有两个列表,这些列表动态地填充了来自库的服务器数据getRangeLabels和getColumnExamples函数的(一个必须在另一个之前填充),所以代码是google.script.run
.withFailureHandler(showError)
.withSuccessHandler(function(ranges) {
loadRanges(ranges);
// once ranges are loaded, load columns
google.script.run
.withSuccessHandler(loadColumns)
.withFailureHandler(showError)
.runSignupFormResponseFunction("getColumnExamples");
})
.runSignupFormResponseFunction("getRangeLabels");Run Code Online (Sandbox Code Playgroud)
今天这对我有用。我希望它适用于可能发现这个问题的其他人。
| 归档时间: |
|
| 查看次数: |
1688 次 |
| 最近记录: |