我在使用 filter() (下面的 19 中)仅提取数据中的电子邮件时遇到问题(请参阅 data)的用户名和姓氏与 eList 最后一列和最后一行中选定的用户相匹配(这些是选定的用户,请参阅附件 eList)。现在filter()正在返回所有电子邮件。有人可以解释一下我做错了什么吗?
这是函数:
//Extracts emails from data of selected users
function getEmailAddresses(e) {
// Get the responses from the form.
const responses = SpreadsheetApp.openById("SHEET_ID").getSheetByName("Form Responses 2");
// Extract the selected names from the checkboxes.
const eList = responses.getRange(responses.getLastRow(),2,1, 1).getValues();
Logger.log("eList\n" + eList);
// Get the spreadsheet and sheet.
const ss = SpreadsheetApp.openById("SHEET_ID");
const shet = ss.getSheetByName('ECI');
const data = shet.getRange(2, 1, shet.getLastRow() - 1, 3).getValues();
Logger.log("Data\n" + data);
// Filter the data based on selected names and extract email addresses.
const emailAddresses = data.map((row) => row[2] || false).filter(Boolean); // Filter() is not returning the emails of the selected users only, returns all emails
Logger.log("Emails\n" + emailAddresses);
// Return the email addresses as a comma-separated string.
return emailAddresses.join(',');
}
// Populates Name in the Form onOpen(e)
function popFormList() {
var sheet = SpreadsheetApp.openById('SHEET_ID').getSheetByName("ECI");
var form = FormApp.getActiveForm();
// Populates values for eList
var siteValues = sheet.getRange(2, 1, sheet.getLastRow() - 1, 2),
values = siteValues.getValues();
values.sort();
Logger.log(values);
/* Populates eList with Names from ECI sheet */
var siteItem = form.getItems(FormApp.ItemType.CHECKBOX)
.filter(function (siteItem) {
return siteItem.getTitle() === "Name";
})[0].asCheckboxItem();
siteItem.setChoiceValues(values);
}
// Runs when form is submitted with selected users to extract the emails of users for comms
function main(e) {
var formResponses = e.response,
itemResponses = formResponses.getItemResponses(),
body = "",
emails = "";
for (x = 0; x < itemResponses.length; x++) {
if (itemResponses[x].getResponse() === "") {
continue;
}
else {
body += itemResponses[x].getItem().getTitle() + ": " + itemResponses[x].getResponse() + "\n";
}
}
emails = getEmailAddresses(e);
subject = "ECI Request"
Logger.log(emails);
Logger.log(body);
try {
// GmailApp.sendEmail(emails, subject, body, { noReply: true});
}
catch (e) {
Logger.log('Error: There was a problem please see below\n' + e);
}
}
现在这一行:
const emailAddresses = data.map((row) => row[2] || false).filter(Boolean);
只是过滤掉空值。您可以看到
eList
根本没有出现在表达式中。
你可以尝试改成这样:
const selectedNames = eList.split(', ').map(item => item.split(','));
const emailAddresses = data.filter(row => selectedNames.includes(row.slice(0, 2))).map((row) => row[2]);