GAS Filter() 未返回预期结果

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

我在使用 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);
  }
}
javascript arrays google-apps-script
1个回答
0
投票

现在这一行:

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]);
© www.soinside.com 2019 - 2024. All rights reserved.