比较两个数组并删除不在其他数组中的数据

问题描述

我是 Apps 脚本的新手,正在尝试比较两个电子邮件列表, 来自谷歌联系人的电子邮件 以及来自 Google 表格的电子邮件(B 列),

我想从 Google 通讯录中删除未在 Google 表格中列出的电子邮件。 我从 here 获得了部分代码并试图修改它以供我使用,但是,我坚持在最后一部分检测不在谷歌表格中的电子邮件,然后从谷歌联系人中删除它。 这是我可以放在一起的内容,从 Google 联系人和 Google 工作表中提取电子邮件工作正常。 运行以下代码不起作用,但我也没有收到任何错误

编辑:我不确定从 google 联系人中提取数据的代码的第一部分是否在一个数组中,因为使用 console.log 时每封电子邮件都是这样打印的:[email1@email.com]

感谢您的帮助,使其发挥作用。

function deleteContacts() {
 var contactEmails = ContactsApp.getContacts().map(function(contact) {
   return contact.getEmailAddresses();
        //console.log("Google Emails:" + contactEmails);

 var sheet = SpreadsheetApp.getActive().getSheetByName("sheet2"); 
 var ColEmails = sheet.getRange('B2:B').getValues().map(function(value) {
   return value[0];
 }).filter(function(val) {
   return val != "";
 })
        //console.log("Sheet Emails:" + ColEmails);
 
for (var i = 0; i < contactEmails.length; i++) {
   if (ColEmails.indexOf(contactEmails[i]) == -1) {
     var contact = ContactsApp.getContactsByEmailAddress(contactEmails[i]);
     ContactsApp.deleteContact(contact);
   }
 }
});
}

解决方法

试试:

function deleteContacts() {
  const ss=SpreadsheetApp.getActive();
  const sh = ss.getSheetByName("sheet2");
  const rg = sh.getRange(2,2,sh.getLastRow()-1,1);
  const vs = rg.getValues().flat();
  const emails = ContactsApp.getContacts().map(function (contact) {return contact.getEmailAddresses();}).flat();
  emails.forEach(e=>{
    if(!~vs.indexOf(e)) {
      ContactsApp.getContact(e).deleteContact()
    }
  });
}