我正在尝试构建一个Google表格电子表格来发送短信提醒。在此阶段,我仍在构建从Google表格发送短信的基础知识。我已经用它们的名称替换了一些字段,例如API SID和令牌以及我的电话号码。我的代码如下:
//At the moment this seems to work when manually run, but not when triggered by time or whatever.
function sendSms(to, body) {
var messages_url = "https://api.twilio.com/2010-04-01/Accounts/API_SID_GOES_HERE/Messages.json"; //This contains my Twilio API LIVE SID
var payload = {
"To": to,
"Body" : body,
"From" : "61123456789" //This is the twilio phone number
};
var options = {
"method" : "post",
"payload" : payload
};
options.headers = {
"Authorization" : "Basic " + Utilities.base64Encode("API_LIVE_TOKEN_GOES_HERE") //This contains my Twilio API LIVE Token
};
UrlFetchApp.fetch(messages_url, options);
}
function sendAll() {
var spreadsheet = SpreadsheetApp.openById("SPREADSHEET_ID_NUMBER") //This part is the ID number of the spreadsheet
var sheet = SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[2]); //This little feller sets an active sheet which it manipulates. Sheet count starts from [0]
var startRow = 2; //starts counting from row #2
var numRows = sheet.getLastRow() - 1;
var dataRange = sheet.getRange(startRow, 1, numRows, 2) //getRange(Integer row, Integer column, Integer numRows, Integer numColumns)
var data = dataRange.getValues(); //Gets just the values of the cells, not the formulas
for (i in data) {
var row = data[i];
try {
response_data = sendSms(row[0], row[1]);
status = "sent";
} catch(err) {
Logger.log(err);
status = "error";
}
sheet.getRange(startRow + Number(i), 4).setValue(status); //The number after (i), is the column where the setValue(Status) will land.
}
}
function myFunction() {
sendAll();
}
看来,如果我手动运行代码,它可以正常工作,发送短信,更新“状态”字段,一切都很好。但是,如果我为脚本设置了触发器,无论是固定时间触发器还是每分钟触发器,脚本都会失败。谷歌应用程序脚本发送给我的失败摘要是:
请求失败 https://api.twilio.com/2010-04-01/Accounts/MY_ACCOUNT_NUMBER/Messages.json 返回代码400。截断的服务器响应:{“代码”:21211, “ message”:““收件人”号码不是有效的电话号码。”, “ more_info”:“ https://www.twilio.com/docs/errors/21211”,“状态”: 400}(使用MutantHttpExceptions选项检查完整响应)(行 19,文件“代码”)
我不太清楚为什么。我认为这与var电子表格和var表格有关,但我真的不知道。
大部分代码已从this twilio博客文章中复制。
答案 0 :(得分:0)
我发现了这一点,这非常明显。
设置触发器时,我完全忽略了定义我希望它触发哪个功能的需要。默认情况下,它只是运行sendSMS函数,当时该函数尚未接收任何要发送的数据。
所以我的手动运行正在运行名为myFunction的函数,但是触发的运行正在运行sendSMS。
一旦我意识到这一点并对其进行了更改,它就可以正常工作。
感谢所有为他们提供帮助的人,尤其是Darpan与我一起追逐红鲱鱼。
答案 1 :(得分:0)
我在2016年的帖子以及上面提交的代码中使用了twilio ling。但是我仍然遇到错误,并且能够使用模拟修复。而不是将触发器设置为使用Myfunction,而是将其设置为使用sendAll函数,并且像一个超级按钮一样工作。下面是我使用的代码。
function sendSms(to, body) {
var messages_url = "https://api.twilio.com/2010-04-01/Accounts/++insert your account sid here ++/Messages.json";
var payload = {
"To": to,
"Body" : "Our Thanks For Signing Up", //body,
"From" : "++ your twillio number here. remember it must begin with the "+" "
};
var options = {
"method" : "post",
"payload" : payload
};
options.headers = {
"Authorization" : "Basic " + Utilities.base64Encode("++insert your account sid here ++:++insert your account token here ++")
};
UrlFetchApp.fetch(messages_url, options);
}
function sendAll() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;
var numRows = sheet.getLastRow() - 1;
var dataRange = sheet.getRange(startRow, 1, numRows, 2)
var data = dataRange.getValues();
for (i in data) {
var row = data[i];
try {
response_data = sendSms(row[0], row[1]);
status = "sent";
} catch(err) {
Logger.log(err);
status = "error";
}
sheet.getRange(startRow + Number(i), 3).setValue(status);
}
}
function myFunction() {
sendAll();
}