首页 > 解决方案 > 使用 Twilio 的 API 的 Google 脚本正确运行但未返回正确的值

问题描述

我遇到了未输出正确值的脚本的问题。否则它完全按预期工作。这是整个脚本:

var statusColumnPos = [2,5]; // Position of status column
var searchColumn = 3 // Column C to search for number of entries

var dataTab = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Booking Tracker"); // Get sheet by Name

var accountSID = "accountSID"; // account SID
var token = "accessToken"; // access token
var authorizationEncoded = "Basic " + Utilities.base64Encode(accountSID+":"+token);
var twillioNumber = "xxxxxxxxxx" // twillio number
var twillioAPI = "https://api.twilio.com/2010-04-01/Accounts/"+accountSID+"/Messages.json"



function getSmsDataFromCell(pos) {
  var cell = dataTab.getRange(pos, statusColumnPos[1]);
  var smsNumber = cell.offset(0, 1).getDisplayValue();
  var smsMessage = cell.offset(0,2).getDisplayValue();
  return [smsNumber, smsMessage];
} 

function statusChecker() {
  var searching = true;
  var count = 1;
  while(searching) {
    var value = dataTab.getRange(count,searchColumn);
    if (value.getValue() == "") {
      searching = false;
      break;
    } else {
      count++;
    }
  }
  var values = dataTab.getRange(statusColumnPos[0], statusColumnPos[1], count - 2);
  var arr = values.getValues();
  var newArr = [];
  for(var i = 0; i < arr.length; i++)
  {   
    if (arr[i][0] === "READY") {
    newArr = newArr.concat(i+2);
    }
  }

  for (var i = 0; i < newArr.length; i++) {
    var data = getSmsDataFromCell(newArr[i]);
    dataTab.getRange(newArr[i], statusColumnPos[1] + 3).setValue("SENDING");
    var result = sendMessage(data[1], data[0], twillioNumber);
    if (result) {
      dataTab.getRange(newArr[i], statusColumnPos[1] + 3).setValue("SENT");
    } else {
      dataTab.getRange(newArr[i], statusColumnPos[1] + 3).setValue("FAILED")
    }
  }
}

function sendMessage(message, to, from) {
  var formData = {
    'Body': message,
    'From': from,
    'To': to,
  };
  var options = {
    'method' : 'post',
    'contentType': 'application/x-www-form-urlencoded',
    'payload' : formData,
    'headers' : {
      'Authorization': authorizationEncoded
    }
  };
  var response = UrlFetchApp.fetch(twillioAPI, options);
  if (response.getResponseCode() === 200 ) {
    return true
  } else {
    Logger.log(response.getContentText());
    return false
  };
}

我遇到的具体问题是此部分没有返回 TRUE:

  var response = UrlFetchApp.fetch(twillioAPI, options);
  if (response.getResponseCode() === 200 ) {
    return true
  } else {
    Logger.log(response.getContentText());
    return false
  };

或者以下语句未按预期工作:

    var result = sendMessage(data[1], data[0], twillioNumber);
    if (result) {
      dataTab.getRange(newArr[i], statusColumnPos[1] + 3).setValue("SENT");
    } else {
      dataTab.getRange(newArr[i], statusColumnPos[1] + 3).setValue("FAILED")
    }
  }
}

SMS 消息按预期发送,但不是在发送后导致 SENT,而是在发送后导致 FAILED。这个结构对我来说似乎是合理的,所以我不想通过在我的脚本中交换 SENT/FAILED 来“快速修复”它。有人看到我没看到的东西吗?

标签: javascriptgoogle-apps-scripttwilio

解决方案


根据 Twilio 的 API 文档,POSTorPUT请求仅在更新资源时返回 HTTP 状态代码 200,而在创建新资源时返回 201:

可能的 POST 或 PUT 响应状态代码

  • 200 OK:请求成功,我们更新了资源并且响应正文包含表示。
  • 201 CREATED:请求成功,我们创建了一个新资源,响应正文包含表示。

来源:使用 HTTP POST 和 PUT 方法创建或更新资源

当我对此进行测试时,返回状态码 201 并成功发送了一条文本。


推荐阅读