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
相关产品推荐
相关产品推荐

