如何高效检查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
相关产品推荐
相关产品推荐

