【问题标题】:Google form approval workflow | issue in Apps Script: "Authorization is required to perform that action."Google 表单审批工作流程 | Apps 脚本中的问题:“执行该操作需要授权。”
【发布时间】:2020-03-14 09:19:27
【问题描述】:

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

我已经完成了 onFormSubmit 函数。这一切正常。

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

当我单击电子邮件以批准或拒绝请求时,我会收到一条消息“需要授权才能执行该操作。”

当我尝试运行 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);

}

【问题讨论】:

  • 这很奇怪,因为如果您使用 [正确的参数](developers.google.com/apps-script/guides/web#request_parameters) 请求,我们似乎应该这样做。您是从编辑器执行此操作吗?如果您确实记得这是预期的,因为您没有引入 doGet 函数的输入变量。你是如何部署你的 webApp 的?您是作为自己还是作为提出请求的人执行此操作?
  • 您好,非常感谢您的帮助。我不知道我需要部署一个 Web 应用程序。我有多傻??当有人在没有完全了解其工作原理的情况下在线复制脚本时会发生这种情况。我现在让它工作了,所以它更新了批准状态,但是在 onFormSubmit 检索请求者的电子邮件时遇到了问题。它正在收集我的电子邮件,而不是活动用户的电子邮件。我已将它从 getEfctiveUser() 更改为 getActiveUser() 但收到相同的结果。 webApp 是否与我安装的触发器冲突,因为它在部署 webApp 之前工作正常?
  • 它不应该真的干扰触发器,记住onFormSubmit()是一个可安装的触发器,需要安装。并且您可以直接检索the event object (e.user) 的用户。不知道你现在有什么问题。
  • 必须补充一点,这个脚本是在业务域上运行的。从我在线阅读的内容来看,只要他们在同一个域中,getEffectiveUser() 就应该返回提交表单的人的电子邮件。如果我错了或者您知道解决方法,请告诉我。不知道为什么 getActiveUser() 不能正常工作?我想我总是可以通过用户填写表单来检索电子邮件。
  • 您使用的触发器已安装在您的帐户中,因此有效用户将是您。您可能应该尝试使用事件对象或尝试使用其他方法。喜欢 webapp 或更改表单以收集用户。

标签: google-apps-script google-sheets workflow google-forms


【解决方案1】:

如果您在 WebApp 中使用 right parameters 并且可以查看 installable triggers

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

【讨论】:

  • 谢谢。我最终选择了最简单的选项并更改了表单以收集用户电子邮件。干杯。
猜你喜欢
  • 2012-07-10
  • 2012-10-25
  • 2013-04-29
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多