javascript - 通过应用 ArrayFormula 的邮件脚本选取正确的单元格值

标签 javascript google-apps-script google-sheets google-forms

我对 Google 脚本一无所知。下面提到的所有脚本包括公式都是在互联网上研究并逐渐即兴创作的。我需要像您这样的专家的帮助才能实现我的成果。我是初学者,所以请写下我能理解的答案。如果您能用简单的语言进行简短的解释来改进我的脚本/公式,那就太好了。

我有两张纸:

1) 表单回复表(链接到表单)

2) DataBnak Sheet(通过查询导入表单响应数据:=query('Form Responses 3'!$A:$BH,"",1)

我正在“DataBank”表中使用ArrayFormula,根据“表单响应”中提取的值创建一个独特的文本报告。该报告需要在提交表格后通过电子邮件发送给每位受访者。报告通过(ArrayFormula)提取到 CH 列中,发送邮件后,我在 CM 列中标记“1”,以确保每次脚本运行时不会发送重复的邮件。

=ArrayFormula(IF(ROW($B:$B)=1,"Breif 报告",IF(ISBLANK($B:$B),"",if(NOT(ISBLANK($CM: $CM)),"",iferror(vlookup(BU:BU&BV:BV&BW:BW&BX:BX,BriefProfile!$E:$F,2,0),"")))))

公式解释:其中B列中的单元格不为空,并且CM列中的单元格不为空(邮件未发送),然后根据列中的查找值(BU,BV)带入预先写好的文本,BW,BX)。

什么是正确的:

1)ArrayFormula 工作完美(它提取正确的预先编写的文本) 2)邮件脚本工作完美(它向那些之前没有发送过邮件的人发送邮件)

什么不起作用: 1) 为受访者选择的文本报告对于所有受访者都是相同的。当我删除 ArrayFormula 并 ValuePaste 文本报告而不是通过上述公式调用它时,邮件脚本会为每个受访者选取正确的唯一报告并发送邮件。

我的邮件脚本如下:

function sendEmails() { // Sends non-duplicate emails with data from the current spreadsheet.
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("DataBank");
    var Avals = sheet.getRange("A1:A").getValues(); // helps getting last fillled row^
    var Alast = Avals.filter(String).length; // helps getting last fillled row^
    var startRow = 2; // First row of data to process
    var numRows = Alast-1; // Number of rows to process - last filled row^

    var dataRange = sheet.getRange(startRow, 1, numRows, 91);  // Fetch the range of cells A2:B3 //.getrange(row,column,numRows,numColumns) numColumns should equal to max column number where data process is required.

  var data = dataRange.getValues();
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var emailAddress = row[1]; // second column, actual column minus one
    var message = row[85]; // 85th column, actual column minus one
    var emailSent = row[90]; // 90th column, actual column minus one
    if (emailSent !== EMAIL_SENT) { // Prevents sending duplicates
      var subject = row[84] //'Sending emails from a Spreadsheet';
      MailApp.sendEmail(emailAddress, subject, message);
      sheet.getRange(startRow + i, 91).setValue(EMAIL_SENT);
      Utilities.sleep(120000); // keeps the script waiting untill the sheet gets updated values from "ArrayFormula"
    }
SpreadsheetApp.flush(); // Make sure the cell is updated right away in case the script is interrupted
  }
}

您可以检查我的邮件脚本并帮助我改进它,以便它能够获取正确的唯一报告吗?

最佳答案

我刚刚解决了。在 for 循环 中声明 var data = dataRange.getValues(); 解决了我的问题。我刚刚找到了解决方案,谢谢大家!

通过在 for 循环之前声明变量,我实际上存储了静态数据,并且在每次迭代中都使用了相同的数据。当我在 for 循环中声明变量时,数据在每次迭代时开始发生变化。

关于javascript - 通过应用 ArrayFormula 的邮件脚本选取正确的单元格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59599824/

相关文章:

javascript - 如何将一组元素包裹在 div 内联中?

javascript - 启用基于另一个输入下拉字段选择的输入字段

javascript - PhoneGap - 显示可用空间?

google-apps-script - 如何对整列使用 indexOf?

google-apps-script - 如何通过apps脚本从googlesheet获取特定范围的行数据

google-sheets - 谷歌表格中的查找值

javascript - JSON 属性返回未定义

google-apps-script - 应用脚本 : Construct range of rows from array of row numbers

arrays - Google Sheets 如何根据单元格引用过滤列

google-sheets - 如何使用Google电子表格中的日期添加功能?