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

问题描述 投票:1回答:1

我对Google脚本一无所知。此处提到的所有脚本,包括公式在内,都已在Internet上进行了研究,并逐渐得到了改进。我需要像您这样的专家的帮助才能实现目标。我是初学者,因此请写出我能理解的答案。如果您通过简单的语言对我的脚本/公式进行简短的说明来改进,那就太好了。

我有两张纸:

1)表单响应表(链接到表单)

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

我正在使用“ DataBank”工作表中的ArrayFormula根据基于“表单响应”的值创建唯一的文本报告。提交表单后,需要将该报告通过电子邮件发送给每个受访者。该报告将通过(ArrayFormula)进入CH列,一旦发送邮件,我将在CM列中标记为“ 1”,以确保每次脚本运行时都不会发送重复的邮件。

=ArrayFormula(IF(ROW($B:$B)=1,"Breif Report",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
  }
}

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

javascript google-apps-script google-sheets google-form
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.