2017-03-06 83 views
0

我建立的系统将执行以下操作:谷歌表/表单脚本截止日期提醒电子邮件发送错误的反应编辑链接

  • 用户提交
  • 的确认电子邮件中的链接发送给编辑表单响应(到目前为止好)的形式
  • ,有一个“截止日期”的问题
  • 触发脚本扫描这些日期的每一天
  • 当到期日已经到来,它会发送提醒邮件(这也发生公关operly,但)
  • 在此提醒电子邮件
  • ,编辑链接是重复的,这样用户不必搜索以前的邮件

可悲的是这个环节送出错误的。它不链接到正确的响应,而是链接到最后编辑(提交)的响应。

下面是脚本:

function sendReminderEmail() { 
 
var sheet = SpreadsheetApp.getActiveSheet(); 
 
var startRow = 2; // First row of data to process 
 
var numRows = sheet.getLastRow()-1; // Number of rows to process 
 
// Fetch the range of cells A2:B3 
 
var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn()); 
 
// Fetch values for each row in the Range. 
 
var data = dataRange.getValues(); 
 
//Logger.log(data) 
 

 
var form = FormApp.openById("IDremovedByMe"); 
 
var formResponses = form.getResponses(); 
 
var r = formResponses.length-1; 
 
var editURL = formResponses[r].getEditResponseUrl(); 
 
//Get the Edit URL 
 

 
for (i in data) { 
 
    var row = data[i]; 
 
    var date = new Date(); 
 
    date.setHours(0); 
 
    date.setMinutes(0); 
 
    date.setSeconds(0); 
 
    //Logger.log(date); 
 
    var sheetDate = new Date(row[13]); 
 
//Logger.log(sheetDate); 
 
var Sdate = Utilities.formatDate(date,'GMT+0100','yyyy:MM:dd') 
 
var SsheetDate = Utilities.formatDate(sheetDate,'GMT+0100', 'yyyy:MM:dd') 
 
    Logger.log(Sdate+' =? '+SsheetDate) 
 
     if (Sdate == SsheetDate){ 
 
      var sendTo = row[4]; // Collect email address from the fourth column (number value is always -1). 
 
      var sendMe = "[email protected]"; // Enter the email address where you wish to receive a notification about a reminder sent. 
 
      var sendername = "Auto Formbot"; // Name displayed as the sender. 
 
      var myname = "Formbot"; // Name displayed as the sender to you. 
 
      var messageTo = "Based on the data you entered, the '" +row[6] +"' project with the ID: " +row[1] +" has ended.\n\nPlease mark it as 'Completed' and update the details as soon as it's convenient for you.\n\nYou can edit your data by using the following link:\n" + editURL + "\n\nThank you for your time.\n\n\nWith kind regards,\nFormbot"; 
 
      var messageMe = "The '" +row[6] +"' project with the ID: " +row[1] +" has finished today.\n\nA reminder email has been sent to " +row[4] +".\n\nYou can edit the data by using the following link:\n" + editURL + "\n\n\nSincerely,\nFormbot"; 
 
      // Above is the column (number value is always -1) selected for activity name display. 
 
      var subjectTo = "Please update the '" +row[6] +"' activity data."; 
 
      var subjectMe = "An activity has finished today [ID: " +row[1] +"]."; 
 
      MailApp.sendEmail(sendTo, subjectTo, messageTo, {name: sendername}); 
 
      MailApp.sendEmail(sendMe, subjectMe, messageMe, {name: myname}); 
 
      }  
 
    } 
 
    }

的问题显然是这一部分:

var form = FormApp.openById("IDremovedByMe"); 
 
var formResponses = form.getResponses(); 
 
var r = formResponses.length-1; 
 
var editURL = formResponses[r].getEditResponseUrl();

我只是不知道浩w解释脚本如何获得适当的响应。

也许我的做法是错误的,也许我应该告诉脚本扫描形式的数据库,而不是链接的电子表格?任何想法如何做到这一点?

+0

我可以想到两种可能的解决方案。两种可能的解决方案都涉及将一些额外信息保存到电子表格。最好的解决方案是将原始编辑URL保存到电子表格中。所以,不要从表单中获取编辑网址。另一种解决方案是将响应ID保存到电子表格中,并通过ID查找正确的表单响应,然后从该响应中获取编辑URL。这两个解决方案看起来很简单,但有一些复杂性。如果不是不可能在电子表格中找到正确的行来追加ID或编辑网址,这非常困难。 –

+0

因此,您需要将所有数据保存到不同的电子表格中,而不是使用“内置”功能。因此,您需要进行更多编程才能将响应数据保存到完全不同的电子表格中,而不是使用“内置”功能的电子表格。您可以尝试通过匹配时间戳和其他信息来查找表单中的正确响应,但可能在表单中具有多个完全相同的时间戳。所以,这不是一个可行的解决方案,除非您确定没有人在同一秒内提交表格。 –

+0

感谢您的建议,并为最近的回复感到抱歉。最后,我选择在表格中记录编辑网址并从那里引用它们。 – mozzribo

回答

1

所以,我选择了直接将URL输入到响应表,并从那里引用它们。

我使用的脚本发现here

function injectEditURLs() { 
    // Form ID: 
    var form = FormApp.openById('IDremovedByMe'); 

    // Name of the (main) sheet and NOT the Sheet file name where the URLs will appear: 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Responses'); 

    var data = sheet.getDataRange().getValues(); 
    var urlCol = 11; // The number of the column in which the URL will be inserted; A = 1, B = 2 etc. 
    var responses = form.getResponses(); 
    var timestamps = [], urls = [], resultUrls = []; 

    for (var i = 0; i < responses.length; i++) { 
    timestamps.push(responses[i].getTimestamp().setMilliseconds(0)); 
    urls.push(responses[i].getEditResponseUrl()); 
    } 
    for (var j = 1; j < data.length; j++) { 

    resultUrls.push([data[j][0]?urls[timestamps.indexOf(data[j][0].setMilliseconds(0))]:'']); 
    } 
    sheet.getRange(2, urlCol, resultUrls.length).setValues(resultUrls); 
} 

然后,我只是引用它(和删除无用位)与在提醒邮件脚本:

" + row[n] +" 

所以现在外观和工作方式是这样的:

function sendReminderEmail() { 
var sheet = SpreadsheetApp.getActiveSheet(); 
var startRow = 2; // First row of data to process 
var numRows = sheet.getLastRow()-1; // Number of rows to process 
// Fetch the range of cells A2:B3 
var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn()); 
// Fetch values for each row in the Range. 
var data = dataRange.getValues(); 
//Logger.log(data) 

for (i in data) { 
    var row = data[i]; 
    var date = new Date(); 
    date.setHours(0); 
    date.setMinutes(0); 
    date.setSeconds(0); 
    //Logger.log(date); 
    var sheetDate = new Date(row[13]); 
//Logger.log(sheetDate); 
var Sdate = Utilities.formatDate(date,'GMT+0100','yyyy:MM:dd') 
var SsheetDate = Utilities.formatDate(sheetDate,'GMT+0100', 'yyyy:MM:dd') 
    Logger.log(Sdate+' =? '+SsheetDate) 
     if (Sdate == SsheetDate){ 
      var sendTo = row[4]; // Collect email address from the fourth column (number value is always -1). 
      var sendMe = "[email protected]"; // Enter the email address where you wish to receive a notification about a reminder sent. 
      var sendername = "Auto Formbot"; // Name displayed as the sender. 
      var myname = "Formbot"; // Name displayed as the sender to you. 
      var messageTo = "Based on the data you entered, the '" +row[6] +"' project with the ID: " +row[1] +" has ended.\n\nPlease mark it as 'Completed' and update the details as soon as it's convenient for you.\n\nYou can edit your data by using the following link:\n" + row[10] + "\n\nThank you for your time.\n\n\nWith kind regards,\nFormbot"; 
      var messageMe = "The '" +row[6] +"' project with the ID: " +row[1] +" has finished today.\n\nA reminder email has been sent to " +row[4] +".\n\nYou can edit the data by using the following link:\n" + row[10] + "\n\n\nSincerely,\nFormbot"; 
      // Above is the column (number value is always -1 because A=0) selected for activity name display. 
      var subjectTo = "Please update the '" +row[6] +"' activity data."; 
      var subjectMe = "An activity has finished today [ID: " +row[1] +"]."; 
      MailApp.sendEmail(sendTo, subjectTo, messageTo, {name: sendername}); 
      MailApp.sendEmail(sendMe, subjectMe, messageMe, {name: myname}); 
      }  
    } 
    } 
0

您对从形式数据库扫描自己的想法是最可行的选择。这里是一个正是这么做的代码片段,从谷歌的形式文档页面:

// Open a form by ID and log the responses to each question. 
 var form = FormApp.openById('1234567890abcdefghijklmnopqrstuvwxyz'); 
 var formResponses = form.getResponses(); 
 for (var i = 0; i < formResponses.length; i++) { 
   var formResponse = formResponses[i]; 
   var itemResponses = formResponse.getItemResponses(); 
   for (var j = 0; j < itemResponses.length; j++) { 
     var itemResponse = itemResponses[j]; 
     Logger.log('Response #%s to the question "%s" was "%s"', 
         (i + 1).toString(), 
         itemResponse.getItem().getTitle(), 
         itemResponse.getResponse()); 
   } 
 } 

这里是链接到该网页:https://developers.google.com/apps-script/reference/forms/item-response

基本上,你会使用形式获取表单回应.responses()然后遍历每个响应并获得截止日期并检查截止日期是否与今天相同。然后发送该特定响应的编辑网址。

希望这有助于,万事如意

+0

非常感谢您的回答,并对已故的回复感到抱歉。我通过将编辑网址保存到答卷中,然后引用正确的行来做了一个解决方法。我可能会在未来给你的脚本去。 – mozzribo

相关问题