为了与同事共享我正在开发的AppsScript代码,我在Google文档模板中创建了一个用作库的独立项目。
此库包含:
在边栏中,有一个按钮触发带有参数的库中的函数调用。
JavaScript调用如下:
google.script.run
.withFailureHandler(
function(msg, element) {
showError(msg, $('#button-bar'));
})
.test();
我在其他页面上读到未公开库代码,因此测试功能实际上在我的文档的AppsScript代码中,并调用了等效的库函数。如此处建议的:Can a Google Spreadsheet Apps Script library contain a user dialog?
Docs AppsScript中的代码:
function test()
{
myLibrary.test();
}
myLibrary库中的代码:
function test()
{
DocumentApp.getUi().alert('test');
}
问题是来自javascript的故障处理程序返回ScriptError,表明我需要获得执行此操作的授权。
关于我在做什么错的任何想法?
PS:我知道我可以添加一个插件,但这不是我可以轻松地在公司内部完成的事情:)
是的,当您使用库中的html代码(侧边栏)时,它将在绑定到文档的脚本内调用test()
函数,而不是库中的那个。
您需要请求用户许可才能提示UI元素,您可以使用自定义菜单[1]进行操作。
此外,用户至少需要具有对库的读取访问权限[2]。我添加了withSuccessHandler
函数[3],以在边栏中显示客户端的响应。以下代码为我工作:
绑定到文档的脚本:
function onOpen() {
DocumentApp.getUi() // Or DocumentApp or SlidesApp or FormApp.
.createMenu('Custom Menu')
.addItem('Show sidebar', 'showSidebar')
.addToUi();
}
function showSidebar() {
myLibrary.showSidebarLibrary();
}
//
function test() {
myLibrary.test();
}
图书馆:
code.gs
function showSidebarLibrary() {
var html = HtmlService.createHtmlOutputFromFile('Page')
.setTitle('My custom sidebar')
.setWidth(300);
DocumentApp.getUi() // Or DocumentApp or SlidesApp or FormApp.
.showSidebar(html);
}
function test() {
DocumentApp.getUi().alert('test');
return "Success";
}
Page.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
Hello, world!<br>
<input type="button" value="Alert" onclick="alert()" /><br>
<input type="button" value="Close" onclick="google.script.host.close()" />
<p id="msg">Replace message with response<p>
</body>
<script>
function alert() {
google.script.run.withFailureHandler(handler).withSuccessHandler(handler).test();
}
function handler(msg) {
document.getElementById("msg").innerHTML = msg;
}
</script>
</html>
[1] https://developers.google.com/apps-script/guides/menus
[3] https://developers.google.com/apps-script/guides/html/communication#success_handlers