Рабочий процесс утверждения формы Google | проблема в скрипте приложения: «Для выполнения этого действия требуется авторизация». - PullRequest
0 голосов
/ 14 марта 2020

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

У меня до этого дошло, что является функцией onFormSubmit. Это все работает.

Когда я прихожу к функции doGet (e), я сталкиваюсь с проблемами. Предполагается получить ответ менеджера и обновить статус электронной таблицы: от ожидающего до одобрения или отклонения. Затем отправителю по электронной почте отправляется сообщение с результатом.

Когда я нажимаю на электронное письмо, чтобы подтвердить или отклонить запрос, я получаю сообщение «Для выполнения этого действия требуется авторизация».

Когда я пытаюсь запустить функцию doGet (запрос), я получаю сообщение об ошибке: «TypeError: Невозможно прочитать свойства« параметров »неопределенного (строка 42)».

var responseID = request.parameters.id;

Возможно ли мне нужно заново авторизовать скрипт из-за новых сервисов? Но это трудно, когда я продолжаю возвращать эту ошибку.

Любая помощь или идеи будут с благодарностью.

Вот полный сценарий:

function onFormSubmit(e) {

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

 // #1 - Identify the requestor's email address and save it to the sheet.
 var email = Session.getEffectiveUser().getEmail();
 sheet.getRange(sheet.getLastRow(), 7).setValue(email);

 // #2 - Get the response ID and save it to the sheet.
 var responseID = e.response.getId();
 sheet.getRange(sheet.getLastRow(), 8).setValue(responseID);

 // #3 - Set the status of the request to 'Pending'.
 sheet.getRange(sheet.getLastRow(), 9).setValue('Pending');

 // Create variables for email
 var items = e.source.getItems();
 var manager_email = e.response.getResponseForItem(items[4]).getResponse();
 var subject = "A leave request has been submitted";

 // Include form data in the body of the email
 var message = "";
 for(var i in items)
 message += "\n\n" + items[i].getTitle() + ": " + 
 e.response.getResponseForItem(items[i]).getResponse();

 // #4 - Insert approve and deny links within the body of the email
 message += "\n\nClick link below to approve: https://script.google.com/macros/s/AKfycbxdS3cUP_oSjfphDaSNkn_5GuxxlPG6czVHH_wGJ2OxImqFASmZ/exec?id=" + responseID + "&status=Approved \n\n" + "Click link below to deny: https://script.google.com/macros/s/AKfycbxdS3cUP_oSjfphDaSNkn_5GuxxlPG6czVHH_wGJ2OxImqFASmZ/exec?id=" + responseID + "&status=Denied";

 // #5 - Email the manager the request information
 MailApp.sendEmail(manager_email, subject, message);

}

function doGet(request) {

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

  // Open the sheet which stores the responses
  var ssID = 'My Sheet 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();
  for (var i=1; i < data.length; i++) {
    if (data[i][7] == responseID){
      sheet.getRange(i+1,9,1,1).setValue(status);
      var date = Utilities.formatDate(data[i][3],"NZ", "EEE, MMM d, yyyy");
      var type = data[i][4];
      var email = data[i][6];
    }
  }

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

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

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

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

}

1 Ответ

1 голос
/ 01 апреля 2020

Если вы используете правильные параметры в WebApp, и вы можете go взглянуть на устанавливаемые триггеры .

Триггер, который у вас есть used был установлен в вашей учетной записи, поэтому эффективным пользователем будет вы. Вам, вероятно, следует попытаться использовать объект события или другие методы для извлечения пользователя. Например, веб-приложение или изменение формы для сбора информации о пользователе.

...