能否通过可安装触发器函数刷新Google Workspace Add-on侧边栏卡片?
解决Google Workspace Add-on新增工作表时更新侧边栏卡片的问题
你的代码存在核心问题:可安装的onChange触发器是后台执行的,没有关联用户界面会话,无法直接返回ActionResponse推送卡片更新。以下是修正后的实现方案:
核心思路
- 用
onChange触发器监听新增工作表事件,通过PropertiesService标记需要更新的状态 - 在侧边栏主页加载(
onHomepage)或用户手动刷新时,读取标记并生成最新卡片 - 可选添加刷新按钮,让用户主动触发卡片更新
完整代码
function onHomepage() { createOnChangeTrigger(); const userProps = PropertiesService.getUserProperties(); const needsUpdate = userProps.getProperty('needsUpdate'); // 根据标记设置问候文本 let greetingText = 'hello'; if (needsUpdate) { greetingText = 'hi(已新增工作表)'; userProps.deleteProperty('needsUpdate'); // 清除标记 } return greetCard(greetingText); } function createOnChangeTrigger() { const activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); const existingTriggers = ScriptApp.getUserTriggers(activeSpreadsheet); // 避免重复创建触发器 if (existingTriggers.some(trigger => trigger.getHandlerFunction() === 'myOnChange')) { return; } ScriptApp.newTrigger('myOnChange') .forSpreadsheet(activeSpreadsheet) .onChange() .create(); } function myOnChange(e) { // 只响应新增工作表的事件(排除重命名、删除等其他变更) if (e.changeType === 'INSERT_GRID') { PropertiesService.getUserProperties().setProperty('needsUpdate', 'true'); // 可选:弹出通知提醒用户刷新侧边栏 SpreadsheetApp.getUi().alert('已新增工作表,刷新侧边栏查看更新'); } } function greetCard(text) { Logger.log('greet: %s', text); const content = CardService.newDecoratedText().setText(text); // 添加刷新按钮,支持用户主动更新卡片 const refreshButton = CardService.newTextButton() .setText('刷新') .setOnClickAction(CardService.newAction().setFunctionName('refreshCard')); const cardSection = CardService.newCardSection() .addWidget(content) .addWidget(refreshButton); return CardService.newCardBuilder() .addSection(cardSection) .build(); } // 手动刷新卡片的函数 function refreshCard() { const userProps = PropertiesService.getUserProperties(); const needsUpdate = userProps.getProperty('needsUpdate'); let greetingText = 'hello'; if (needsUpdate) { greetingText = 'hi(已新增工作表)'; userProps.deleteProperty('needsUpdate'); } const updatedCard = greetCard(greetingText); return CardService.newActionResponseBuilder() .setNavigation(CardService.newNavigation().popToRoot().pushCard(updatedCard)) .build(); }
关键修正点
- 触发器事件过滤:新增
e.changeType === 'INSERT_GRID'判断,确保只在新增工作表时触发状态标记 - 状态存储:用
PropertiesService记录更新需求,替代直接推送卡片的无效操作 - 主动刷新支持:添加刷新按钮,让用户可以手动触发卡片更新,同时主页加载时自动检查状态并更新
- 触发器重复创建防护:优化
createOnChangeTrigger的判断逻辑,避免重复创建同名触发器
内容的提问来源于stack exchange,提问作者paolooo
相关产品推荐
相关产品推荐

