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

Google Sheets 实现每人每日仅弹出一次消息框的代码修正方案

Google Sheets团队规划表每日单次提醒弹窗修复方案

原代码核心缺陷:仅判断email!A1是否为空,既不区分访问用户,也不做日期重置,且getValues()返回二维数组直接和空字符串判断永远不成立,导致每次打开文件都触发弹窗。


1. 单用户单日单次弹窗实现逻辑

核心判断规则调整为**「当日日期+当前用户邮箱」双维度校验**,不再用单一单元格存单条记录:

  • 每次打开文件触发脚本时,先获取当前登录用户邮箱、当前日期(按脚本所在时区格式化,避免跨时区日期偏差)
  • 仅当「今日日期+当前邮箱」的组合没有出现在历史触发记录里时,才弹出提醒弹窗
  • 用户响应弹窗后,自动把当前日期、当前邮箱作为一条记录追加到存储表,当天重复打开文件时直接跳过弹窗逻辑

2. 已触发用户邮箱校验方法

把存储范围调整为email工作表的A、B两列:A列存触发日期,B列存对应用户邮箱,校验逻辑如下:

  • 读取email!A:B的所有非空行数据,得到二维数组格式的记录集
  • 先筛选出A列日期等于今日日期的所有记录
  • 遍历筛选后的记录,检查B列是否存在和当前用户邮箱完全匹配的值,匹配成功则说明该用户今日已收到过弹窗,直接终止后续逻辑

注意:不要用原代码的单单元格存储逻辑,多用户使用时会出现第一个人触发后所有人都收不到弹窗的问题。

3. 每日自动清空记录实现

单独写一个清空记录的函数,配合Apps Script自带的时间驱动触发器实现每日自动重置:

  • 函数逻辑:触发时直接清空email工作表中所有已存的历史记录(保留表头)
  • 触发器配置:在脚本编辑器的触发器面板,设置该函数每日凌晨(低峰时段)自动执行即可,无需手动清理。

修改后完整代码

// 主函数:绑定到文件打开触发事件
function meet() {
  const ss = SpreadsheetApp.getActive();
  let emailSheet = ss.getSheetByName("email");
  // 初始化email工作表,不存在则自动创建
  if (!emailSheet) {
    emailSheet = ss.insertSheet("email");
    emailSheet.getRange("A1:B1").setValues([["触发日期", "用户邮箱"]]);
  }

  // 获取当前用户、当日日期
  const currentEmail = Session.getActiveUser().getEmail().trim();
  const today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd");

  // 读取所有历史记录
  const lastRow = emailSheet.getLastRow();
  // 没有历史记录(除表头)直接走弹窗逻辑
  if (lastRow < 2) {
    showReminderAndLog(emailSheet, today, currentEmail);
    return;
  }
  const allRecords = emailSheet.getRange(2, 1, lastRow - 1, 2).getValues();

  // 校验今日当前用户是否已触发过弹窗
  const hasTriggered = allRecords.some(row => row[0] === today && row[1].trim() === currentEmail);
  if (hasTriggered) return;

  // 未触发则弹出提醒,记录日志
  showReminderAndLog(emailSheet, today, currentEmail);
}

// 弹窗逻辑+记录写入
function showReminderAndLog(sheet, date, email) {
  const response = Browser.msgBox('Ciao!', 'Hai inserito le tue riunioni/meet di oggi?', Browser.Buttons.YES_NO);
  if (response == "yes") {
    Browser.msgBox('Ottimo!', 'Buon lavoro!', Browser.Buttons.OK);
  } else {
    Browser.msgBox('mmmh!', 'Ricordati di farlo!', Browser.Buttons.OK);
  }
  // 追加记录到表中
  sheet.appendRow([date, email]);
}

// 每日清空记录函数,绑定时间触发器
function clearDailyRecord() {
  const emailSheet = SpreadsheetApp.getActive().getSheetByName("email");
  if (!emailSheet) return;
  const lastRow = emailSheet.getLastRow();
  // 保留表头,清空所有历史记录
  if (lastRow > 1) {
    emailSheet.getRange(2, 1, lastRow - 1, 2).clearContent();
  }
}

配置步骤

  • 打开脚本编辑器,删除原有代码,粘贴上述完整代码并保存。
  • 给主函数meet绑定打开触发规则:点击左侧边栏时钟形状的「触发器」按钮,新建触发器,选择要运行的函数为meet,事件源选择「从电子表格」,事件类型选择「打开时」,按提示完成账号授权即可。
  • 给清空函数clearDailyRecord绑定每日定时规则:再次新建触发器,选择要运行的函数为clearDailyRecord,事件源选择「时间驱动」,触发类型选择「日计时器」,选择凌晨1-2点的低峰时段保存,脚本会每日自动清空前一天的触发记录,无需手动操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:01:01