【问题标题】:Google sheets script sending twilio SMS messages works when run manually but fails when triggered by time发送 twilio SMS 消息的 Google 表格脚本在手动运行时有效,但在时间触发时失败
【发布时间】:2018-08-09 09:34:33
【问题描述】:

我正在尝试构建一个谷歌表格电子表格来发送短信提醒。在这个阶段,我仍然只是构建从谷歌表格发送短信的基础知识。我已经用他们的名字替换了一些字段,例如 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。截断的服务器响应:{“code”:21211, "message": "'To' 号码不是有效的电话号码。", “更多信息”:“https://www.twilio.com/docs/errors/21211”,“状态”: 400}(使用 muteHttpExceptions 选项检查完整响应)(行 19、文件“代码”)

我不太明白为什么。我认为它与 var 电子表格和 var sheet 有关系,但我真的不知道。

大部分代码是从thistwilio 博文复制而来的。

【问题讨论】:

  • 我不认为它与时基/手动触发器有任何问题。错误清楚地表明TO 号码存在问题。添加登录sendSms功能并在发送短信前打印TO号码,然后尝试一次基于时间的触发。还要交叉检查您的工作表数据一次。
  • 你好,所以我继续在我的代码中添加了一些日志记录,我将其设置为将“to”变量输出到工作表上的特定单元格。当我手动运行我的代码时,它会使用正确的电话号码填充该单元格,并且 SMS 会成功通过。然后,当我添加触发条件时,该日志记录单元将填充 '{authMode=FULL, week-of-year=32, day-of-week=4, month=8, hour=12, year=2018, timezone= UTC, day-of-month=9, triggerUid=1048705414, minute=0, second=59}',我从谷歌收到同样的失败摘要邮件,没有短信。
  • 哦!如果可能,请分享您的工作表。也为这些单元格查找格式
  • 就是这样,它非常基础。只是一个标题行,一个数据行,三列数据,“6,6”只是我转储日志输出的一个偏僻的地方:docs.google.com/spreadsheets/d/…
  • 为什么在触发函数中使用setActiveSheet?只需使用getSheetByName。基于时间的触发器没有与其执行关联的 UI 实例,所以我的想法是您在触发运行期间访问第一张表上的值。如果您在使用之前记录工作表名称和行数据,这应该会立即显现出来......

标签: javascript google-apps-script google-sheets twilio


【解决方案1】:

我想通了,这是非常明显的事情。

在设置触发器时,我完全忽略了定义我希望它触发的功能的需要。默认情况下,它只是运行函数 sendSMS,此时还没有任何数据要发送。

所以我的手动运行正在运行名为 myFunction 的函数,但触发的运行正在运行 sendSMS。

一旦我意识到这一点并对其进行了更改,它就可以正常工作了。

感谢所有提供帮助的人,特别是 Darpan 和我一起追逐红鲱鱼。

【讨论】:

  • 很高兴为您提供帮助! :)
【解决方案2】:

我在 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-10
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多