簡體   English   中英

Google表格/表格腳本到期日提醒電子郵件發送錯誤回復編輯鏈接

[英]Google Sheets/Forms Script Due Date Reminder email Sends Wrong Response Edit Link

我設置的系統執行以下操作:

  • 用戶提交表格
  • 會發送一封確認電子郵件,其中包含一個可編輯回復的鏈接(到目前為止非常好)
  • 表格中有一個“到期日”問題
  • 觸發腳本每天掃描這些日期
  • 當到期日期到來時,它會發送一封提醒電子郵件(這種情況也很正常,但是)
  • 在此提醒電子郵件中,重復了編輯鏈接,因此用戶不必搜索上一封郵件

遺憾的是,此鏈接發送有誤。 它沒有鏈接到正確的響應,而是提供了到最后編輯(提交)的響應的鏈接。

這是腳本:

 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 = "xyzabcloremipsum@gmail.com"; // 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(); 

我只是不確定如何解釋腳本如何獲得適當的響應。

也許我的方法是錯誤的,也許我應該告訴腳本掃描表單數據庫而不是鏈接的電子表格? 關於如何做到這一點的任何想法?

因此,我選擇將URL直接插入到響應表中並從那里引用它們。

我使用了在這里找到的腳本。

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 = "xyzabcloremipsum@gmail.com";  // 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});
            }    
   }
  }

您自己認為從表單數據庫進行掃描是最可行的選擇。 這是Google表單文檔頁面中的代碼片段,其功能完全相同:

// 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

基本上,您將使用form.responses()獲得表單響應,然后遍歷每個響應並獲取截止日期,並檢查截止日期是否與今天相同。 然后發送該特定響應的編輯URL。

希望這會有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM