Почему функция триггера doGet не может получить доступ к параметрам, переданным в запросе? - PullRequest
0 голосов
/ 13 июля 2020

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

Самая большая проблема, с которой я столкнулся, - это doGet, кажется, не может читать параметры. Если я вставляю параметры в код, он работает нормально, но когда я пытаюсь передать переменные с помощью ссылки https, это не работает. Есть идеи?

Я опубликовал его как веб-приложение и предоставил доступ к нему всем в моем домене.

Вот https-ссылка: https://script.google.com/a/olemissalumni.com/macros/s/mywebappURL/exec?id=2_ABaOnue6Zr2ADAQPNUo-NdwmIgOL-J4Gk9H6ihNVkqZwLs2ubWh_0SaXYdllDpb_1r6AyCA&status=Approved

Вот функция триггера doGet.

function doGet(e) {

  //testing variables

  //  var responseID = '2_ABaOnue6Zr2ADAQPNUo-NdwmIgOL-J4Gk9H6ihNVkqZwLs2ubWh_0SaXYdllDpb_1r6AyCA';
  //  var status = 'Approved';


  // Retrieve the parameter information for response ID and status
  var responseID = e.parameters.id;
  var status = e.parameters.status;

  // Open the sheet which stores the responses
  var ssID = 'spreadsheet id' // Replace with spreadsheet ID
  var ssName = 'Form Responses' // Replace with sheet name
  var sheet = SpreadsheetApp.openById(ssID).getSheetByName(ssName);

  // Find the row where the ID in the URL equals the ID in the sheet and update the
  // status to the parameter value
  var data = sheet.getDataRange().getValues();
  Logger.log('Email' + data[1][1]);
  Logger.log('type' + data[1][9]);
  //console.log(data);
  for (var i = 0; i < data.length; i++) {
    if (data[i][11] == responseID) {
      sheet.getRange(i, 12, 1, 1).setValue(status);
      var date = Utilities.formatDate(data[i][0], "GMT+0200", "EEE, MMM d, yyyy");
      var type = data[i][10];
      var email = data[i][1]; //get the actual email address of the person who filled out the e
      sheet.getRange(i, 13, 1, 1).setValue(email);
    }
  }

  if (status == 'Approved') {
    var subject = 'Your e for time-off has been approved';
    var message = 'Your e for time-off (' + type + ') on ' + date + ' has been approved.';

  } else {
    var subject = 'Your e for time-off has been denied';
    var message = 'Your e for time-off (' + type + ') on ' + date + ' has been denied.';
  }

  // Send email to employee alerting them of the approval/denial of e
  MailApp.sendEmail(email, subject, message);

  // Show message to manager that the response has been updated.
  var result = "The e has been '" + status + "'.";
  return ContentService.createTextOutput(result);

}

1 Ответ

1 голос
/ 14 июля 2020

Ваше веб-приложение правильно обращается к параметрам, источник ошибки отличается

  • Хотя в целом для получения строк, а не массивов, вы должны использовать e.parameter вместо e.parameters, в вашем случае Приложения Скрипт преобразует массив в строку за вас, так что сравнение типа if (['Approved'] == 'Approved') вернет true
  • Однако в целом будьте осторожны при сравнении значений с массивами и используйте e.parameter вместо e.parameters для доступа к отдельным значениям
  • Теперь настоящая проблема вашего кода заключается в том, что MailApp.sendEmail(email, subject, message); находится за пределами for l oop
  • внутри for l oop и внутренний оператор if, вы перезаписываете значение emaildate и type) и отправляете электронное письмо после выхода из l oop на последнее сохраненное электронное письмо
  • Это приведет к проблемы, если
  • data[i][11] == responseID запрос выполняется более одного раза
  • Если в data[i][1]
  • нет действующего адреса электронной почты * Если if условие никогда не выполняется
  • В последнем если переменная email не существует, но сценарий все еще пытается отправить электронное письмо и выдает ошибки

Решение:

  • Переместить электронное письмо отправка функции в оператор if
  • Кроме того, включите журналы через код, чтобы убедиться, что вы получаете правильные данные (в одной строке вы определяете Logger.log('type' + data[1][9]); и позже: var type = data[i][10];
  • Убедитесь, что вы развернули свое WebApp как новую версию после включения изменений.

Пример:

function doGet(e) {
  
  //testing variables
  
  //  var responseID = '2_ABaOnue6Zr2ADAQPNUo-NdwmIgOL-J4Gk9H6ihNVkqZwLs2ubWh_0SaXYdllDpb_1r6AyCA';
  //  var status = 'Approved';
  
  
  // Retrieve the parameter information for response ID and status
  var responseID = e.parameter.id;
  var status = e.parameter.status;
  
  // Open the sheet which stores the responses
  var ssID = 'spreadsheet id' // Replace with spreadsheet ID
  var ssName = 'Form Responses' // Replace with sheet name
  var sheet = SpreadsheetApp.getActive().getActiveSheet()//.openById(ssID).getSheetByName(ssName);
  
  // Find the row where the ID in the URL equals the ID in the sheet and update the
  // status to the parameter value
  var data = sheet.getDataRange().getValues();
  Logger.log('Email' + data[1][1]);
  Logger.log('type' + data[1][9]);
  //console.log(data);
  for (var i = 0; i < data.length; i++) {
    if (data[i][11] == responseID) {
      sheet.getRange(i, 12, 1, 1).setValue(status);
      var date = Utilities.formatDate(data[i][0], "GMT+0200", "EEE, MMM d, yyyy");
      // 9 or 10???!!!
      var type = data[i][10];
      var email = data[i][1]; //get the actual email address of the person who filled out the e
      sheet.getRange(i, 13, 1, 1).setValue(email);      
      if (status == 'Approved') {
        var subject = 'Your e for time-off has been approved';
        var message = 'Your e for time-off (' + type + ') on ' + date + ' has been approved.';
        
      } else {
        var subject = 'Your e for time-off has been denied';
        var message = 'Your e for time-off (' + type + ') on ' + date + ' has been denied.';
      }
      
      // Send email to employee alerting them of the approval/denial of e
      Logger.log("email will be sent");
      MailApp.sendEmail(email, subject, message);
    }
  }
  
  // Show message to manager that the response has been updated.
  var result = "The e has been '" + status + "'.";
  return ContentService.createTextOutput(result);  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...