【问题标题】:GAS: Replacing every regex-match in all sheets with cell addressGAS:用单元格地址替换所有工作表中的每个正则表达式匹配
【发布时间】:2017-12-11 13:35:13
【问题描述】:

我想在 Google 电子表格中搜索“xyz”的所有实例,并将每个“y”替换为单元格引用和工作表名称。

想象一下,我在一张名为“星期一”的表格中有这张表格:

甲乙 1 xyz 2 xyz

然后我想要替换 A1 和 B2 中的文本,结果是这样的:

甲乙 1 xA1星期一z 2 xB2Mondayz

剩下的工作表以此类推。

到目前为止,我还没有找到类似的问题...

我的代码如下所示:

function replaceY() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheets = spreadsheet.getSheets();
  //Do for each sheet
  for(m = 0; m < sheets.length; m++){
    var data = sheets[m].getDataRange().getValues();
     for(var i = 0; i < data.length; i++){
      for(var n = 0; n < data[0].length; n++){
        if(typeof(data[i][n]) == 'string'){
          var regex = /.*(y).*/ig;
          var result = regex.exec(data[i][n]);
          if(result[1] !== null){ 
            var currentCellAddress = sheets[m].getActiveRange();
            // Loop through regex matches and replace every group
            // with currentCellAddress and sheet name
          }
        }
      }
    }
  }
}

我意识到我在这里可能超出了我的深度,但如果你知道解决方案,我会很高兴看到它!

更新 我收到的错误是:无法读取 null 的属性“1”。 这没有任何循环匹配。

【问题讨论】:

  • 代码有什么问题?你有错误吗? :)
  • @sniperd 是的。 TypeError:无法读取 null 的属性“1”。这没有任何循环匹配。
  • 为什么不使用 indexOf('String') 方法?

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


【解决方案1】:

你的代码很好。以下添加对我有用:

function replaceY() {
  var spreadsheet = SpreadsheetApp.getActive();      // Declaring variables  
  var sheets = spreadsheet.getSheets();              // outside of the loop.
  var regex = /y/ig;     // Using a simpler regex.
  var data, name, str, range, result, startRow, startCol, row, col, notation, replaceWith; 

  //Do for each sheet
  for(m = 0; m < sheets.length; m++){
    range = sheets[m].getDataRange()
    data = range.getValues();

    for(var i = 0; i < data.length; i++){
      for(var n = 0; n < data[0].length; n++){

        if(typeof(data[i][n]) == 'string'){
          result = regex.exec(data[i][n]);

          if(result !== null){ // * I removed the [1] because result was not considered
                               // * an array for some reason.
            name = sheets[m].getName();

            // get the A1 notation, then combine with the sheet name.
            // create a range with current indices, then get its notation.
            notation = sheets[m].getRange(i+1, n+1).getA1Notation();
            replaceWith = notation+name;
            data[i][n] = data[i][n].replace(regex, replaceWith);

          }
        }
      }
    }
    range.setValues(data);
  }
}

似乎删除代码中的[1] (result[1]) 也防止了您收到的错误。

如果它也适合你,请告诉我!

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 2015-11-28
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多