App Script基于时间触发器无法向Telegram发送提醒问题排查
问题排查与修复建议
针对你的Google Apps Script代码执行后Telegram Bot未收到提醒的问题,结合代码细节,以下是几个关键排查点和修复方案:
1. 隐式全局变量引发的作用域冲突
代码中dateCols、dateCol、peopleList、i、am等多个变量未用let/const声明,属于隐式全局变量。这类变量容易被外部代码意外覆盖,或因作用域冲突导致逻辑异常。
修复:
为所有变量添加声明:
function reminder() { const returnFormattedDate = (date) => Utilities.formatDate(date, "GMT+8", "dd/MM/yyyy"); const dateCols = paradeStateSheet .getRange(1, 4, 1, 62) .getValues() .flat() .filter((date) => date != "") .map(returnFormattedDate); let dateCol = dateCols.indexOf(correctedDate) * 2 + 4; const peopleList = paradeStateSheet.getRange(3, 2, totalSheetUsers, 2).getValues(); const paradeStates = paradeStateSheet .getRange(3, dateCol, totalSheetUsers, 2) .getValues(); let startTime = Date.now(); for (let i = 0; i < totalSheetUsers; i++) { const am = paradeStates[i][0]; const pm = paradeStates[i][1]; let message = ""; // 后续代码保持不变
2. 逻辑运算符使用错误
判断am和pm均为空时,误用了位运算符&而非逻辑与&&。位运算符会对数值进行位运算,虽在布尔场景下可能偶然得到正确结果,但不符合逻辑判断语义,易引发意外行为。
修复:
替换运算符为&&:
if ((am == "") && (pm == "")) { message = "Please input your AM parade state, followed by your PM parade state ASAP"; }
3. 空消息无效发送问题
当am和pm均不为空时,message会保持空字符串,此时调用sendMessage发送空内容,Telegram Bot不会显示该消息,且属于无效请求。
修复:
添加非空判断,仅发送有效提醒:
if (message) { try { sendMessage(peopleList[i][0], message, STATUS_KB); startTime = Date.now(); } catch (e) { Logger.log(`发送消息给用户${peopleList[i][0]}失败: ${e}`); } }
4. 错误吞灭导致无法排查问题
try-catch的catch块为空,导致sendMessage执行出错时无法获取错误信息,无法定位问题根源(如用户ID错误、Telegram API调用异常等)。
修复:
在catch中添加日志记录:
try { sendMessage(peopleList[i][0], message, STATUS_KB); startTime = Date.now(); } catch (e) { Logger.log(`发送消息失败,用户ID: ${peopleList[i][0]},错误信息: ${e}`); }
5. 日期索引匹配验证
确认correctedDate的格式与returnFormattedDate返回的dd/MM/yyyy完全一致(无多余空格、格式严格匹配)。若dateCols.indexOf(correctedDate)返回-1,会导致dateCol = 2,进而获取错误列的paradeStates数据,最终无符合条件的提醒消息。
验证方法:
添加日志查看索引值:
const dateIndex = dateCols.indexOf(correctedDate); Logger.log(`日期匹配索引: ${dateIndex}`); let dateCol = dateIndex * 2 + 4;
6. 依赖变量初始化验证
确认外部依赖项均正确初始化:
paradeStateSheet是否为有效Sheet对象(如通过SpreadsheetApp.openById(SheetID).getSheetByName("SheetName")获取);totalSheetUsers是否为正确的用户数量,避免循环范围错误;sendMessage函数是否正确实现Telegram API调用,参数传递无误。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

