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

如何高效检查Google Sheets侧边栏的开闭状态?

检查Google Sheets侧边栏开闭状态的优化方案

Google Apps Script本身没有提供直接API来检测侧边栏是否被用户手动关闭,以下是几个比持续缓存设置更高效的方案:

1. 利用google.script.run调用失败检测

当侧边栏被关闭后,客户端JS发起的google.script.run调用会直接失败(连接已断开),可通过监听这个失败状态标记侧边栏关闭:

客户端HTML/JS代码:

<script>
  // 定时发起轻量调用,监听失败状态
  const keepAlive = setInterval(() => {
    google.script.run
      .withFailureHandler(() => {
        // 调用失败,说明侧边栏已关闭
        clearInterval(keepAlive);
      })
      .noop(); // 服务器端的空函数
  }, 5000); // 每5秒检查一次
</script>

服务器端Apps Script代码:

function noop() {
  // 空函数,仅用于触发调用
}

这个方案无需持续写入缓存/属性,仅通过调用失败判断状态,减少服务器资源消耗。

2. 监听beforeunload事件

侧边栏关闭前会触发浏览器的beforeunload事件,可在这个时机主动通知服务器端标记状态:

客户端HTML/JS代码:

<script>
  window.addEventListener('beforeunload', () => {
    // 调用服务器端函数标记状态
    google.script.run.markSidebarClosed();
  });
</script>

服务器端Apps Script代码:

function markSidebarClosed() {
  PropertiesService.getUserProperties().setProperty('sidebarStatus', 'closed');
}

// 检查状态的函数
function getSidebarStatus() {
  return PropertiesService.getUserProperties().getProperty('sidebarStatus') || 'closed';
}

注意:beforeunload事件中尽量使用轻量同步调用,避免异步调用未完成就关闭页面。这个方案属于主动通知,比心跳检测更及时。

3. 心跳+超时判断的优化缓存方案

若偏好缓存/属性服务,可优化为心跳上报+超时判断,减少写入频率:

客户端HTML/JS代码:

<script>
  // 每10秒上报一次心跳
  setInterval(() => {
    google.script.run.reportSidebarHeartbeat();
  }, 10000);
</script>

服务器端Apps Script代码:

function reportSidebarHeartbeat() {
  PropertiesService.getUserProperties().setProperty('lastSidebarHeartbeat', Date.now().toString());
}

function isSidebarOpen() {
  const lastHeartbeat = PropertiesService.getUserProperties().getProperty('lastSidebarHeartbeat');
  if (!lastHeartbeat) return false;
  // 最后心跳在15秒内,判定为侧边栏仍打开
  return (Date.now() - parseInt(lastHeartbeat)) < 15000;
}

这个方案把持续写入改成间隔上报,检查时通过超时判断状态,大幅减少属性服务的写入次数,提升效率。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:30:53