Google表单Apps Script关闭prompt后出现常驻Working toast问题求助
问题:Google表单Apps Script调用
ui.prompt后“Working...”提示框持续停留 问题详情
我开发了一款Google表单的简易Apps Script应用,支持将日历事件附加到表单并发送给受访者。目前遇到的问题是:通过HTML侧边栏的google.script.run调用服务器端的promptUser函数(使用FormApp.getUi().prompt或alert),关闭弹窗后,表单左下角会出现“Working...”的提示框(toast)并持续停留,直到下一个弹窗出现才会被替换。
相关截图:
用到的promptUser函数代码:
function promptUser(message) { // 显示带输入框、OK按钮的弹窗,用户也可点击标题栏关闭 let ui = FormApp.getUi(); let response = ui.prompt(message, ui.ButtonSet.OK); // 处理用户响应 if (response.getSelectedButton() == ui.Button.OK) { return response.getResponseText(); } else if (response.getSelectedButton() == ui.Button.CLOSE) { return false; } }
触发原因
google.script.run在执行服务器端函数时,默认会自动显示“Working...”的toast提示,用于告知用户脚本正在运行。但当服务器端函数中调用FormApp.getUi()的弹窗(prompt/alert)时,异步调用的状态会被弹窗打断,导致Apps Script无法正确触发toast的关闭逻辑,最终造成提示框一直停留在界面上。
解决办法
方法1:禁用google.script.run的默认提示(推荐)
调用google.script.run时添加suppressNotifications: true参数,直接关闭默认的“Working...”提示,从根源解决问题。如果需要告知用户脚本状态,可以自行在前端添加自定义提示。
修改后的前端调用示例:
// 替换原有调用逻辑 google.script.run .withSuccessHandler(function(response) { // 处理服务器返回的响应 if (response) { console.log("用户输入:" + response); } else { console.log("用户关闭了弹窗"); } }) .withFailureHandler(function(error) { // 处理错误 console.error("出错了:" + error.message); }) .suppressNotifications(true) // 关键:禁用默认的Working提示 .promptUser("请输入内容");
方法2:主动清除/替换提示(备选)
如果需要保留默认提示,可以在服务器端函数执行完毕后,主动调用FormApp.getUi().showToast()来替换或清除原有提示。不过这种方法可能存在延迟,不如方法1可靠。
修改后的promptUser函数示例:
function promptUser(message) { let ui = FormApp.getUi(); let response = ui.prompt(message, ui.ButtonSet.OK); // 执行完毕后主动清除提示 ui.showToast("", "", 0); // 空内容+0时长,相当于清除现有toast if (response.getSelectedButton() == ui.Button.OK) { return response.getResponseText(); } else if (response.getSelectedButton() == ui.Button.CLOSE) { return false; } }
注意事项
- 无需被迫改用
ModalDialog(除非有特殊需求),因为该方案需要自行编写HTML处理输入,流程繁琐,方法1已能完美解决问题。 - 该问题同样存在于
FormApp.getUi().alert(),解决思路完全一致。
内容的提问来源于stack exchange,提问作者Joshua Q
相关产品推荐
相关产品推荐

