【问题标题】:Apps Scirpt and regex. How?Apps 脚本和正则表达式。如何?
【发布时间】:2020-05-11 12:11:44
【问题描述】:

我正在使用 .indexOf() 通过 url 解析单独工作表中的数组,并在标题中查找字符串以返回数值或 -1。问题是我需要找到不区分大小写的字符串匹配。即 var targetEmail = targetHeader.indexOf("Email");将需要匹配“电子邮件”、“用户电子邮件”、“用户电子邮件”等。通常我会使用正则表达式,但在 Apps 脚本中找不到这样做的方法。非常感谢任何帮助。

示例代码如下:

var userHeader = USER.getRange(1, 1, 1, USER.getLastColumn()).getValues()[0];
var targetHeader = importSheet.getRange(1, 1, 1, importSheet.getLastColumn()).getValues()[0];
var ui = SpreadsheetApp.getUi();


 var targetEmail = targetHeader.indexOf("Email");
 if(targetEmail == -1)
    ui.alert("Can not find Email column. Please rename column in source sheet.");

【问题讨论】:

    标签: regex google-apps-script google-sheets


    【解决方案1】:

    使用Javascript RegExp,可以使用如下

    let targetEmail = targetHeader.findIndex(h => /email/gi.test(h));
    if(targetEmail == -1) 
      ui.alert("Can not find Email column. Please rename column in source sheet.");
    

    注意:findIndexlet 和函数简写仅在您的脚本使用新的 V8 运行时才有效。

    我个人更喜欢使用 Google 表格命名范围来命名我想要的列,然后使用 getNamedRanges(),因此无论列标题文本如何,我都可以通过其范围名称找到列号。如果插入或删除列,命名范围仍指向您要查找的列。

    【讨论】:

    • 我相信OP想要找到列号。
    • @ADW,OP 也在询问如何在 Apps 脚本中使用 RegExp。但是谢谢,我已经更新了我的代码以更直接地回答他们的问题。
    【解决方案2】:

    你可以解决这个问题

    (1) 将数组连接成字符串

    targetHeader.join()

    (2) 然后把字符串改成小写

    toLowerCase()

    然后寻找“电子邮件”(小写)。

      var targetHeader = importSheet.getRange(1, 1, 1, importSheet.getLastColumn()).getValues()[0];
      targetHeader = targetHeader.join().toLowerCase();
      var targetEmail = targetHeader.indexOf('email');
    

    编辑:

    要查找包含单词“电子邮件”的列号:

      var importSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet101');
      var targetHeader = importSheet.getRange(1, 1, 1, importSheet.getLastColumn()).getValues()[0];
      var flag = false;
      for (var c = 0; c < targetHeader.length; c++) {
        var cellValue = targetHeader[c].toLowerCase();
        if (cellValue.indexOf('email') > -1) {
          flag = true;
          break;
        }
      }
      if (!flag) {
        // ui alert that email not found
      } else {
        var columnWithEmalInHeader = c + 1;
        // column with value 'email' found. Column number is c+1
        // first time match of 'email' will pop-up here. All subsequent amounts will be ignored.
      }
    

    【讨论】:

    • 这就是问题所在。当我的代码找到文本的匹配项时,它返回找到所述字符串的数组位置,然后将数值传递给另一个函数,该函数然后通过检索到的数值检索存储在所述单独电子表格的相应列中的数据。如果我使用 .join() 我冒着遇到“用户电子邮件”的风险,这会使返回的数组位置增加 +1 不是吗?这样做会传递不正确的值并检索不正确的列。
    • 您需要额外的代码才能做到这一点。请参阅上面的编辑。
    • 没错,这将适用于这个实例,但不会优雅地扩展。谢谢你的。时间和。洞察力。我有很多标题要搜索...我希望。找到一种在 AppsScript 中使用正则表达式的方法,但我没有找到它。
    • indexOf(/someexpression/i);或者我只是缺少一些功能......
    • var column={};targetHeader.forEach(function(e,l){column[e]=I});然后使用 column[header name] 查找索引
    猜你喜欢
    • 2017-07-16
    • 1970-01-01
    • 2015-04-11
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    相关资源
    最近更新 更多