首页 > 解决方案 > 遍历数组,在单元格中查找子字符串,替换 Google 表格中的文本

问题描述

我想在 Google 表格中创建一个函数,该函数循环遍历一个数组,找到一个字符串,然后用新值替换字符串的文本。我有有效的代码,但它仅在单元格仅包含字符串时替换文本(即搜索“office”替换为“Office”仅在单元格仅包含“office”时才有效)。我希望能够替换“office” ” 与“Office”,即使单元格包含“office 867”。下面是有效的代码。另外,我怎样才能获得搜索 A 列第 1 行的功能?截至目前,该功能仅查找和替换如果值在 B2 中(即不搜索第一列 A,并且不搜索每隔一行的第一行。函数适用于 B2 到任何位置,但不适用于 B1、C1、D1 等。我知道这是因为 searchRange 变量,但我不知道如何设置参数以便它搜索整个工作表(即所有列和所有行)。所以这是我到目前为止的代码。我的问题在代码中作为注释:

// This code works but ONLY if entire cell matches the string being searched for
// I want to search for all cells that contain the string even if other text is present
// So if cell contains "office 98" I want to change that to "Office 98"
// If cell contains "blg 78" I want to change that to "Building 78"
// If cell contains "space 9876" I want to change that to "Space 9876"
// Also, how do I change the var searchRange so that the range is the entire sheet?

var ui = SpreadsheetApp.getUi();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var rangeData = sheet.getDataRange();
var lastColumn = rangeData.getLastColumn();
var lastRow = rangeData.getLastRow();
var searchRange = sheet.getRange(2,2, lastRow-1, lastColumn-1);

function findReplace() {
  var rangeValues = searchRange.getValues();
  for ( i = 0; i < lastColumn - 1; i++){
    for ( j = 0 ; j < lastRow - 1; j++){
      if(rangeValues[j][i] === "office"){
        sheet.getRange(j+2,i+2).setValue("Office");
      }else if (rangeValues[j][i] === "blg"){
        sheet.getRange(j+2,i+2).setValue("Building");
       }else if (rangeValues[j][i] === "space"){
        sheet.getRange(j+2,i+2).setValue("Space");
      }; 
    };
  };
};

标签: arraysfunctiongoogle-apps-scriptgoogle-sheetsreplace

解决方案


function findReplace() {
  const ui=SpreadsheetApp.getUi();
  const ss=SpreadsheetApp.getActiveSpreadsheet();
  const srchA=['office','blg','space'];
  const vA=['Office','Building','Space'];
  const sh=ss.getActiveSheet();
  const rg=sh.getRange(2,2,sh.getLastRow()-1,sh.getLastColumn()-1);
  const v=rg.getValues();
  v.forEach(function(r,i){
    r.forEach(function(c,j){
      srchA.forEach(function(s,k){
        if(v[i][j].toString().includes(s,k)) {
          sh.getRange(i+2,j+2).setValue(vA[k]);
        }
      });
    });
  });
}

推荐阅读