Google 表单审批工作流程 | Apps 脚本中的问题:"Authorization is required to perform that action."

Google form approval workflow | issue in Apps Script: "Authorization is required to perform that action."

我正在编写通过 Google 表格申请休假的脚本。我在网上找到了这个脚本,并一直在努力让它发挥作用。提交表单时,脚本会检索并使用交易 ID、请求者的电子邮件填充链接的电子表格,并将请求状态设置为 'pending'。然后它会向经理发送一封电子邮件,并在电子邮件中包含批准或拒绝请求的链接。

我一直在处理 onFormSubmit 函数。一切正常。

当我使用 doGet(e) 函数时,我 运行 遇到了问题。它应该检索经理的响应并将电子表格状态从待定更新为批准或拒绝。然后会将结果通过电子邮件发送给请求者。

当我在电子邮件中单击以批准或拒绝请求时,我收到一条消息 "Authorization is required to perform that action."

当我尝试 运行 doGet(request) 函数时,出现错误:"TypeError: Cannot read property 'parameters' of undefined (line 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);

}

如果您正在使用 right parameters in the WebApp and you are good to go take a look at installable triggers

您使用的触发器已安装在您的帐户中,因此有效用户就是您。您可能应该尝试使用事件对象或尝试其他方法来检索用户。点赞webapp或更改表单收集用户信息