l oop через массив, найти подстроку в ячейке, заменить текст в Google Sheets - PullRequest
1 голос
/ 13 февраля 2020

Я хочу создать функцию в Google Sheets, которая проходит по массиву, находит строку и заменяет текст строки новым значением. У меня есть код, который работает, но он заменяет текст только в том случае, если в ячейке содержится ТОЛЬКО строка (ie Поиск "офис" заменить на "Офис" работает только в том случае, если в ячейке содержится только "офис). Я хочу иметь возможность заменить "office" с "Office", даже если ячейка содержит "office 867". Ниже приведен код, который работает. Кроме того, как я могу получить функцию для поиска в столбце A, строке 1 во что угодно? На данный момент функция находит только и заменяет, если значения находятся в B2, независимо от того, (ie первый столбец A не ищется, а первая строка каждой другой строки не ищется. Функция работает на B2 с любым, но не будет работать на B1, C1, D1 , и т. д. c. Я знаю, что это из-за переменной searchRange, но я не могу понять, как установить параметры, чтобы он искал весь лист (ie все столбцы и все строки). Так вот код, который я до сих пор. У меня есть вопросы в коде как комментарии:

// 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");
      }; 
    };
  };
};

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Вы можете использовать функцию getDataRange [1], чтобы получить весь диапазон, в котором есть данные на листе. Чтобы избежать совпадения всей строки, используйте метод indexOf [2], чтобы проверить, находится ли искомая строка внутри строки ячейки. Чтобы заменить только искомую строку, используйте replace function [3] для значения в ячейке. Я также поставил проверку строки, чтобы игнорировать любой другой тип значения ячейки (Число, Дата, Логическое значение):

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var searchRange = sheet.getDataRange();
var lastColumn = searchRange.getLastColumn();
var lastRow = searchRange.getLastRow();

function findReplace() {
  var rangeValues = searchRange.getValues();
  for ( i = 0; i < lastColumn; i++){
    for ( j = 0 ; j < lastRow; j++){
      var value = rangeValues[j][i];
      if(typeof value != "string") { continue; }
      if(value.indexOf("office") > -1){
        var newValue = value.replace("office", "Office")
        sheet.getRange(j+1,i+1).setValue(newValue);
      }
      else if (value.indexOf("blg") > -1){
        var newValue = value.replace("blg", "Building")
        sheet.getRange(j+1,i+1).setValue(newValue);
      }
      else if (value.indexOf("space") > -1){
        var newValue = value.replace("space", "Space")
        sheet.getRange(j+1,i+1).setValue(newValue);
      }; 
    };
  };
};

[1] https://developers.google.com/apps-script/reference/spreadsheet/sheet#getdatarange

[2] https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf

[3] https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

0 голосов
/ 14 февраля 2020
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]);
        }
      });
    });
  });
}
...