Google Apps Script插件侧边栏监听其他窗口关闭更新状态栏方案
可落地的实现方案
方案1:调整触发逻辑,完全规避跨窗口操作(最推荐)
不要在Picker窗口的回调中执行服务端导入逻辑,改为仅通过回调向侧边栏传递选中的文件参数,由侧边栏触发后台任务,直接就能更新状态栏:
- Picker选完文件后的回调里,直接将选中的文件ID/元数据传递给侧边栏上下文,随后关闭Picker窗口
- 侧边栏收到文件参数后,调用
google.script.run执行服务端导入逻辑,直接在该方法的withSuccessHandler回调中更新状态栏为「完成」即可
这个方案完全不需要处理跨窗口通信,兼容性最好,也不存在权限限制问题。
方案2:用postMessage实现跨窗口通信
如果必须在Picker回调中执行服务端逻辑,可通过浏览器原生的跨窗口消息机制传递状态:
- 在Picker的回调函数中,等服务端逻辑执行完成后,向父窗口(即侧边栏)发送状态消息:
// Picker回调内的代码 window.parent.postMessage({ event: 'import_finished', status: 'success' }, '*'); // 之后再关闭Picker窗口
- 在侧边栏的JS代码中注册消息监听,收到对应事件后更新状态栏:
// 侧边栏初始化时注册监听 window.addEventListener('message', (e) => { // 可补充origin校验规则提升安全性 if (e.data?.event === 'import_finished') { document.querySelector('#status-bar').textContent = '完成'; } });
方案3:服务端状态轮询(兜底方案)
如果跨窗口通信被谷歌安全策略拦截,可以用轮询的方式同步状态:
- 触发导入任务时生成唯一的任务ID,同时将该ID存储到侧边栏的全局变量,以及服务端的
PropertiesService中,初始状态标记为pending - 侧边栏启动定时器,每隔1-2秒调用
google.script.run查询对应任务ID的执行状态 - 服务端导入完成后更新
PropertiesService中对应任务的状态为complete,侧边栏查询到状态变更后更新状态栏,同时清除定时器
内容的提问来源于stack exchange,提问作者Josh Bunzel
相关产品推荐
相关产品推荐

