Функция скриптов Google листов UrlFetchApp.fetch не запускается из .onEdit (e), но работает из редактора - PullRequest
1 голос
/ 10 мая 2019

Я создал страницу Google с большим количеством информации для кубка по пляжному волейболу и хочу вызвать API, созданный мной, когда на этом листе установлен флажок.

function onEdit(e){
  const ui = SpreadsheetApp.getUi();
  const spreadsheets = SpreadsheetApp.getActive();
  const configSheet = spreadsheets.getSheetByName("Config")
  var tourneyId = String(configSheet.getRange(2,4).getValue())
  var tourneyTitle = String(configSheet.getRange(2,5).getValue())
  var sheet = spreadsheets.getActiveSheet()
  if (sheet.getName() == "LiveScore"){
    var actRng = sheet.getActiveRange();
    var editColumn = actRng.getColumn();
    var rowIndex = actRng.getRowIndex();
    actRng = actRng.getCell(1, 1);
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();
    if(editColumn == 7 && rowIndex != 1){
      onStartBroadcastClicked(actRng, ui, sheet, rowIndex, editColumn, tourneyTitle);
    }
  }
}

С этой частью никогда не возникает проблем, как я ее вижу. Но когда я вхожу в функцию onStartBroadcastClicked:

function onStartBroadcastClicked(actRng, ui, sheet, rowIndex, editColumn, tourneyTitle){
  var homeTeam = String(sheet.getRange(rowIndex, 14).getValue());
... // more setting variables
  var endTime = new Date(startTime.getTime() + MILLIS_PER_MATCH);

  if(actRng.isChecked()){
    var response = ui.alert("You are about to start a new broadcast. Are you sure?" +
                            "\n Title: " + title, ui.ButtonSet.YES_NO);
    if (response == ui.Button.YES) {
      var httpRequest = "https://someUrl";
      var options =
          {
            'method':'POST',
            'contentType': 'application/json',
            'payload' : JSON.stringify({
              "title" : title,
                  ... // setting all variables
              "description" : description
            }),
            'muteHttpExceptions' : true,
            'headers' : {
              "Authorization": "Basic " + Utilities.base64Encode(USERNAME + ":" + PASSWORD)
            }
          };

      ui.alert("Waiting.......")
      var result = UrlFetchApp.fetch(httpRequest, options);
      ui.alert(result.getContentText())

Проблема в том, что он всегда попадает на строку ui.alert("Waiting......."), но при запуске из флажка он никогда не завершает запрос http POST. Если я нажимаю кнопку воспроизведения в редакторе, это успешно выполняется, и я получаю ответ в окне предупреждения.

Это может быть тайм-аут или проблемы с автосохранением? У кого-нибудь есть идеи, если куда продолжать искать? Я застрял здесь на некоторое время, и я был бы очень рад, если бы кто-нибудь указал мне правильное направление.

1 Ответ

1 голос
/ 11 мая 2019

Точка модификации вашей проблемы - использовать устанавливаемый триггер события OnEdit.Когда методы, которые требуются для авторизации, используются при простом триггере, возникает ошибка.Эта ситуация заставляет нас думать, что сценарий не работает.

Чтобы избежать этой ошибки, используйте устанавливаемые триггеры триггера события OnEdit.

В качестве важного момента, прежде чемВы устанавливаете триггер, пожалуйста, переименуйте имя функции onEdit() на другое имя.И установите переименованное имя функции в качестве триггера события OnEdit.Таким образом, дублирующий прогон onEdit() может быть предотвращен.Если в качестве устанавливаемого триггера установлена ​​функция onEdit(), то при редактировании ячейки функция запускается 2 раза. Ref .

При указанных выше настройках при редактировании ячейки UrlFetchApp.fetch() работает.

Ссылки:

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