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

求助:如何实现自定义菜单函数的1分钟冷却机制?

问题解决:自定义菜单函数的1分钟冷却限制

原代码存在的核心问题

  • 变量作用域错误:cooldown是onOpen内的局部变量,其他函数无法访问,每次调用函数都会重置,完全起不到冷却控制作用。
  • 语法错误:使用了<-作为赋值运算符(JavaScript中应使用=);if(cooldown = 0)是赋值操作而非判断,应使用===。
  • 冷却实现逻辑错误:Utilities.sleep()会阻塞当前函数执行,且Google Apps Script的函数执行有时间限制,无法在后台维持冷却计时,这种方式根本无法实现“运行后等待1分钟再允许调用”的需求。

修正后的代码

function onOpen(){
  var menu = SpreadsheetApp.getUi().createMenu("r/place menu");
  menu.addSeparator();
  menu.addItem("Set Color", "SetColor");
  menu.addItem("Dev: Disable CD", "DevDisableCD");
  menu.addToUi();
};

function DevDisableCD(){
  // 清除冷却记录,强制允许立即调用
  PropertiesService.getUserProperties().deleteProperty("lastRunTime");
  SpreadsheetApp.getActive().toast("冷却已禁用", "提示");
}

function SetColor() {
  const userProps = PropertiesService.getUserProperties();
  const lastRunTime = userProps.getProperty("lastRunTime");
  const currentTime = Date.now();
  const COOLDOWN_DURATION = 60 * 1000; // 1分钟,单位毫秒

  // 检查冷却状态:无记录 或 已过冷却时间
  if(!lastRunTime || (currentTime - parseInt(lastRunTime) >= COOLDOWN_DURATION)){
    var ui = SpreadsheetApp.getUi();
    var result = ui.prompt(
      'Set Color',
      '请输入十六进制颜色值(例:#000000):',
      ui.ButtonSet.OK_CANCEL);
    
    // 用户点击取消则直接返回
    if(result.getSelectedButton() === ui.Button.CANCEL) return;
    
    var cellcolor = result.getResponseText().trim();
    var spreadsheet = SpreadsheetApp.getActive();
    
    if(cellcolor !== ''){
      spreadsheet.getCurrentCell().setValue('a').activate();
      spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
      spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Place'), true);
      spreadsheet.getActiveRangeList().setBackground(cellcolor);
      
      // 更新最后执行时间,开启冷却
      userProps.setProperty("lastRunTime", currentTime.toString());
    } else {
      ui.alert("请输入有效的颜色值");
    }
  } else {
    // 计算剩余冷却时间
    const remaining = Math.ceil((COOLDOWN_DURATION - (currentTime - parseInt(lastRunTime)))/1000);
    SpreadsheetApp.getActive().toast(`冷却中!还剩${remaining}秒`, "提示");
  }
};

关键改动说明

  • 用PropertiesService持久化存储:通过用户属性存储上次执行时间,确保刷新页面或重新打开表格后冷却状态依然有效。
  • 时间差判断替代sleep:每次调用函数时计算当前时间与上次执行时间的差值,判断是否满足冷却要求,避免阻塞函数执行。
  • 修复语法错误:修正赋值运算符和条件判断的语法问题,增加用户取消输入的处理逻辑。
  • 优化提示信息:显示剩余冷却时间,提升用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:20:29