Google Script, использующий API Twilio, работает правильно, но не возвращает правильное значение - PullRequest
0 голосов
/ 08 февраля 2020

У меня проблемы со скриптом, который не выводит правильное значение. В остальном он работает точно так, как задумано. Вот весь сценарий:

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
  };
}

У меня есть проблема c, которая заключается в том, что либо этот раздел не возвращает 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 после отправки это приводит к ОТКАЗУ после отправки. Структура мне кажется здоровой, поэтому я не хочу «быстро исправлять» ее, меняя SENT / FAILED в моем скрипте. Кто-нибудь видит то, чего я не вижу?

1 Ответ

2 голосов
/ 08 февраля 2020

Согласно документации API Twilio, запрос POST или PUT возвращает код состояния HTTP 200, только если ресурс обновлен, и возвращает 201, если создан новый ресурс:

* 1005. * Возможные коды состояния ответа POST или PUT
  • 200 OK: запрос выполнен успешно, мы обновили ресурс, а тело ответа содержит представление.
  • 201 СОЗДАНО: запрос выполнен успешно , мы создали новый ресурс, а тело ответа содержит представление.

Источник: Создание или обновление ресурсов с помощью методов HTTP POST и PUT .

Когда я это проверял, был возвращен код состояния 201 и успешно отправлен текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...