获取Google表单脚本生成的电子邮件以将数据传输到响应表

时间:2014-06-05 19:53:47

标签: email google-apps-script google-sheets google-form

我目前正在尝试设置审批工作流程。当谈到这些东西时,我还是比较年轻的。但到目前为止,它已经在可敬的水平上工作,以便在一个例子的帮助下满足我们的需求。

我正在使用Email Approval using Google Script and a Form中的模板/示例。

我遇到的问题是,由于缺乏功能,在通过生成的电子邮件接受或拒绝时,我希望它能够将数据记录到最后的Google表格行中电子邮件生成的列。

我可能会在稍后添加第二个时间戳,回复电子邮件等。

那么那一行会显示填写的初始表格,然后空白/接受/拒绝作为状态。

感谢您的任何时间或帮助。

2 个答案:

答案 0 :(得分:0)

James Ferreira最初撰写的审批工作流程是故意非常基本的。增强它以提供批准和原始请求之间的关联在概念上很简单,但由于细节和限制,使代码复杂化。

需要考虑的事情:

  • 表单响应包括一个时间戳,我们可以将其用作响应的一种“序列号”,因为它在这样的应用程序中很有可能是唯一的。

    • 我们可以将此标识符与批准电子邮件中嵌入的其余URL一起传递,然后将其作为参数返回给webapp.

    • 在应用程序之间传递像时间戳这样的对象可能会很麻烦。为确保批准电子邮件中嵌入的URL有效,我们需要使用encodeURIComponent()对时间戳的字符串表示进行编码,然后在webapp使用时对其进行解码。

    • 使用Romain Vaillard 2D Array library中的ArrayLib.indexOf()可以简化搜索匹配项。此函数将所有数组数据转换为字符串以进行比较,因此它非常适合我们的时间戳。

    • 或者,我们可以努力创建一些“保证”唯一的其他标识符。

  • 批准 - 响应网络应用(doGet())无法理解“activeSpreadsheet”的含义,即使它是电子表格中包含的脚本。这意味着我们需要一种方法来打开电子表格并记录审批结果。为了简化这个例子,我假设我们将使用一个常量,并为每个部署更新代码。 (伊克!)。

screenshot

所以这是更好的费用审批工作流程脚本。

// Utilizes 2D Array Library, https://sites.google.com/site/scriptsexamples/custom-methods/2d-arrays-library
//                            MOHgh9lncF2UxY-NXF58v3eVJ5jnXUK_T

function sendEmail(e) {
  // Response columns: Timestamp    Requester Email Item    Cost
  var email = e.namedValues["Requester Email"];
  var item = e.namedValues["Item"];
  var cost = e.namedValues["Cost"];
  var timestamp = e.namedValues["Timestamp"];

  var url = ScriptApp.getService().getUrl();

  // Enhancement: include timestamp to coordinate response  
  var options = '?approval=%APPROVE%&timestamp=%TIMESTAMP%&reply=%EMAIL%'
         .replace("%TIMESTAMP%",encodeURIComponent(e.namedValues["Timestamp"]))
         .replace("%EMAIL%",e.namedValues["Requester Email"])         
  var approve = url+options.replace("%APPROVE%","Approved"); 
  var reject = url+options.replace("%APPROVE%","Rejected");

  var html = "<body>"+
                "<h2>Please review</h2><br />"+
                "Request from: " + email + "<br />"+
                "For: "+item +", at a cost of: $" + cost + "<br /><br />"+ 
                "<a href="+ approve +">Approve</a><br />"+
                "<a href="+ reject +">Reject</a><br />"+
             "</body>";

  MailApp.sendEmail(Session.getEffectiveUser().getEmail(),
                    "Approval Request", 
                    "Requires html",
                    {htmlBody: html});  
}

function doGet(e){
  var answer = (e.parameter.approval === 'Approved') ? 'Buy it!' : 'Not this time, Keep saving'; 
  var timestamp = e.parameter.timestamp;

  MailApp.sendEmail(e.parameter.reply, "Purchase Request", 
                    "Your manager said: "+ answer);   

  // Enhancement: store approval with request
  var sheet = SpreadsheetApp.openById(###Sheet-Id###).getSheetByName("Form Responses");
  var data = sheet.getDataRange().getValues();
  var headers = data[0];
  var approvalCol = headers.indexOf("Approval") + 1;
  if (0 === approvalCol) throw new Error ("Must add Approval column.");

  // Record approval or rejection in spreadsheet
  var row = ArrayLib.indexOf(data, 0, timestamp);
  if (row < 0) throw new Error ("Request not available.");  // Throw error if request was not found
  sheet.getRange(row+1, approvalCol).setValue(e.parameter.approval);

  // Display response to approver
  var app = UiApp.createApplication();
  app.add(app.createHTML('<h2>An email was sent to '+ e.parameter.reply + ' saying: '+ answer + '</h2>'))
  return app
}

答案 1 :(得分:0)

所以,我试过这个,但是数据数组中的日期格式存在问题。为了使其工作,您必须使用formatDate重新格式化doGet中的时间戳。

我使用以下内容使其与数组中显示的格式匹配。

var newDate = Utilities.formatDate(new Date(timestamp),“PST”,“EEE MMM d yyyy HH:mm:ss'GMT'Z'(PST)'”);

最后,当然更新传递给newDate的indexof参数。