Google Sheet调用Twilio发短信脚本手动正常触发器执行失败如何解决
问题排查与修复方案
问题根本原因
手动运行脚本时,你当前打开的就是存储收件人号码、短信内容的工作表,getActiveSheet() 可以正确读取到目标数据;但时间触发器是后台静默运行,不存在「当前激活的工作表」上下文,getActiveSheet() 会默认读取整个表格文件的第一个工作表,如果你的目标数据不在第一个工作表,就会读取到空值,导致Twilio请求中的To参数为空,触发报错中的21211错误。
修复步骤
- 将
getActiveSheet()替换为按固定名称/ID获取工作表,完全规避上下文差异带来的取值错误 - 增加空值校验逻辑,读取到无效的收件人号码时直接跳过,不发起无效请求
- 确认所有存储的收件人号码都带国家码前缀,符合Twilio的号码格式要求
- 可选增加调试日志,后续如果出现问题可以直接查看日志确认参数取值是否正常
修改后可用代码
function RunThisToSendTexts() { function sendSms(to, body) { var messagesUrl = "https://api.twilio.com/2010-04-01/Accounts/AC9837381a431941024fc87xxxxxx/Messages.json"; var payload = { "To": to, "Body" : body, "From" : "+197131999xx" }; var options = { "method" : "post", "payload" : payload }; options.headers = { "Authorization" : "Basic " + Utilities.base64Encode("AC9837381a431941024fcxxxxxxx:22c7dec97dee0cef39exxxxxxx") }; UrlFetchApp.fetch(messagesUrl, options); } function sendAll() { // 把这里的「短信数据」替换成你实际存储数据的工作表名称 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("短信数据"); var startRow = 2; // First row of data to process var numRows = sheet.getLastRow() - 1; // 先判断有没有数据,避免无数据时报错 if(numRows < 1) return; var dataRange = sheet.getRange(startRow, 1, numRows, 2) var data = dataRange.getValues(); for (i in data) { var row = data[i]; var toNum = row[0] ? row[0].toString().trim() : ""; var content = row[1] ? row[1].toString().trim() : ""; // 号码或者内容为空直接跳过 if(!toNum || !content) { sheet.getRange(startRow + Number(i), 3).setValue("参数为空"); continue; } try { response_data = sendSms(toNum, content); status = "sent"; } catch(err) { Logger.log(err); status = "error"; } sheet.getRange(startRow + Number(i), 3).setValue(status); } } sendAll(); }
内容的提问来源于stack exchange,提问作者Homework Hour
相关产品推荐
相关产品推荐

