【问题标题】:Custom function in google sheet using indexOf谷歌表中使用 indexOf 的自定义函数
【发布时间】:2021-01-30 13:03:14
【问题描述】:

我有一个需要清理的电子邮件列表,并确定其中哪些电子邮件是公司电子邮件(即 info@、hello@ 等)

我有一个想法,在一个 google 表格中添加行,然后将其与另一个带有公司别名列的 google 表格进行检查。然后,这将在输入表的 Company Alias? 列中返回 Trueof False

这是我的Google sheet example.

我认为它需要遍历第二张表的值并比较第一张表中的email 1 字段以查看它是否包含该值。我在下面制作了一个应用程序脚本:

function CHECKALIAS(x) {

var app = SpreadsheetApp;  
var aliasSheet = app.getActive().getSheetByName('Company_Alias').getRange(2, 1, 45, 1);  
var aliasRange = aliasSheet.getValues();
var str = x;

if(str.indexOf(aliasRange) !== -1){
  return false;
  } else {
  return true;
  }  

}

我收到以下错误:

TypeError: Cannot read property 'indexOf' of undefined (line 13, file "Code")

【问题讨论】:

  • x 等于 str 这就是为什么你得到一个错误,你在哪里使用这个函数,换句话说,从哪里调用函数?

标签: javascript google-apps-script indexof


【解决方案1】:

您是否在不传递值的情况下运行该函数?它给你错误是因为str 没有价值。

无论如何,这里不需要自定义函数。如果与其中一个别名匹配,这将返回 true。

=REGEXMATCH(A1, JOIN("|",FILTER(Company_Alias!A2:A, NOT(ISBLANK(Company_Alias!A2:A)))))

【讨论】:

    【解决方案2】:

    str 是一个字符串,aliasRange 是一个数组。与其在字符串中搜索数组,不如在数组中搜索字符串。

    另一个问题是.getValues​​()返回一个数组数组:

    [["info @"], ["support @"], ["sales @"], ...]. 
    

    要将其转换为一维数组,请使用flat() 函数:

    function CHECKALIAS(x) {
      let app = SpreadsheetApp;
      let aliasSheet = app.getActive().getSheetByName('Company_Alias').getRange(2, 1, 45, 1);
      let aliasRange = aliasSheet.getValues().flat(); // Transforms 2D array in 1D
    
      let userDomain = x.split('@'); // split "admin@somedomain.com"  into  [ "admin", "somedomain.com" ]
      let usr = userDomain[0] + '@'; // "admin@
    
      return aliasRange.indexOf(usr) !== -1; // Is usr in aliasRange?
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      相关资源
      最近更新 更多