Как мне преобразовать Range [] в целочисленное значение / значение класса? - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь создать код сценария приложения, в котором при каждом совпадении с термином CM создается новая строка. Проблема в том, что метод «FindAll» возвращает все диапазоны, в которых существует CM, а метод «getRow» не может преобразовать все эти диапазоны в целочисленные значения для метода «insertRowsAfter».

function searchString() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Team Ideas');
  var search = "CM"
  var textFinder = sheet.createTextFinder(search).findAll();
  var row = textFinder.getRow();

  sheet.insertRowsAfter(row, 1);
  sheet.getActiveRange().offset(sheet.getActiveRange().getNumRows(), 0, 1, sheet.getActiveRange().getNumColumns()).activate();
}

Ответы [ 3 ]

1 голос
/ 20 июня 2019

Вот что я сделал с textFinder findAll ()

function regexSearch(sObj) {
  var ss=SpreadsheetApp.openById(sObj.ssid);
  var tf=ss.createTextFinder(sObj.pattern).useRegularExpression(true);
  var all=tf.findAll();
  var matches='';
  for(var i=0;i<all.length;i++) {
    matches+=Utilities.formatString('Sheet: %s Cell: %s Row: %s Col: %s Value: %s\n',all[i].getSheet().getName(),all[i].getA1Notation(),all[i].getRow(),all[i].getColumn(),all[i].getValue());
  }
  if(matches) {
    sObj.matches=matches;
  }else{
    sObj.message(Utilities.formatString('No Matches found for %s',sObj.pattern));
  }
  return sObj;
}

Вы заметите, что метод findAll () возвращает диапазон, из которого вы можете определить лист, строку и столбец.

1 голос
/ 20 июня 2019

Похоже, вам просто нужно рассматривать textFinder как массив объектов, а не как объект.Из документации видно, что findAll () возвращает массив.

Следующие пункты будут проходить через каждый элемент и вставлять пустую строку.Обратите внимание, что массив переворачивается перед этим.Это сделано для сохранения индекса того, где находятся строки.Если бы мы пошли вниз по списку, то нам пришлось бы учитывать изменение индекса в последующих матчах.

Попробуйте:

function searchString() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Team Ideas');
  var search = "CM"
  var textFinder = sheet.createTextFinder(search).findAll();
  textFinder.reverse();
  textFinder.forEach(function(t){
    var row = t.getRow();
    sheet.insertRowsAfter(row, 1);
  });
}
1 голос
/ 20 июня 2019

Требование:

Найдите все вхождения "CM" на листе и вставьте новую строку под каждым вхождением.


Решение:

Loop throughмассив уже создан с помощью var textFinder и создайте строку для каждого объекта.


Пример:

function searchString() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Team Ideas');
  var search = "CM"
  var textFinder = sheet.createTextFinder(search).findAll();
  for (i = 0; i < textFinder.length; i++) {
    var row = textFinder[i].getRow();
    sheet.insertRowAfter(row + i);
  }
}

Объяснение:

Ваш var textFinder уже создает массив, который выглядит следующим образом:

[Range, Range, Range, Range]

Таким образом, все, что мы делаем в новом цикле for, это циклический просмотр каждого элемента в этом массиве (диапазон для каждого вхождения "CM"") и вставив строку после этого диапазона, используя insertRowAfter().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...