You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过可安装触发器函数刷新Google Workspace Add-on侧边栏卡片?

解决Google Workspace Add-on新增工作表时更新侧边栏卡片的问题

你的代码存在核心问题:可安装的onChange触发器是后台执行的,没有关联用户界面会话,无法直接返回ActionResponse推送卡片更新。以下是修正后的实现方案:

核心思路

  1. 用onChange触发器监听新增工作表事件,通过PropertiesService标记需要更新的状态
  2. 在侧边栏主页加载(onHomepage)或用户手动刷新时,读取标记并生成最新卡片
  3. 可选添加刷新按钮,让用户主动触发卡片更新

完整代码

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();
}

关键修正点

  1. 触发器事件过滤:新增e.changeType === 'INSERT_GRID'判断,确保只在新增工作表时触发状态标记
  2. 状态存储:用PropertiesService记录更新需求,替代直接推送卡片的无效操作
  3. 主动刷新支持:添加刷新按钮,让用户可以手动触发卡片更新,同时主页加载时自动检查状态并更新
  4. 触发器重复创建防护:优化createOnChangeTrigger的判断逻辑,避免重复创建同名触发器

内容的提问来源于stack exchange,提问作者paolooo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:55:20