Существует ли эффективный способ поиска и добавления строки в столбец ячеек в скрипте приложений Google? - PullRequest
0 голосов
/ 18 марта 2020

Как видно из заголовка, в настоящее время я запускаю функцию, которая, на мой взгляд, может быть более эффективной.

По сути, в моей таблице есть столбец (k), в котором я ищу текст "delete" in. Если этот текст найден, я просто добавляю ", removed" к нему. Это позволяет приложению, работающему вне таблицы, знать, что эта строка не отображается, если она видит текст "removed".

Например, случайная строка col k может выглядеть следующим образом после запуска функции: delete, completed, removed

Проблема здесь в том, что наш лист имеет 4000 строк, и для его завершения требуется более 1000 секунд. Конечно, должен быть более быстрый способ поиска и добавления текста, а не итеративно для каждой строки в листе с помощью для l oop.

function removeDeleted() {
  var ss = SpreadsheetApp.openById(BD_SPREADSHEET_ID);
  var data = ss.getSheetByName(DATA_TAB);
  var dataRange = data.getDataRange().getValues();
  var colData = [];

  for (var i = 1; i < dataRange.length; i++) {
    colData.push(dataRange[i][0]);
  }

  for (var i = 0; i < colData.length; i++) {

    // Take every cell except the first row on col Q (11), as that is the header
    var comments_cell = data.getDataRange().getCell(i + 2, 11).getValue();

    // Check for string "delete" inside cell
    if (comments_cell.toString().indexOf("delete") !== -1 || comments_cell.toString().indexOf("Delete") !== -1) {

      // Check for string "removed" not already inside cell
      if (!(comments_cell.toString().indexOf("removed") !== -1)) {

        // Append ", removed"
          data.getDataRange().getCell(i + 2, 11).setValue(comments_cell + ", removed");
      }
    }
  }
}

Я все еще изучаю скрипт и электронную таблицу приложений Google интеграция, так что я чувствую, что может быть некоторая избыточность с двумя циклами for. Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Я бы сделал это так:

Одно чтение. Одна запись.

function addRemoved() {
  var ss=SpreadsheetApp.openById(BD_SPREADSHEET_ID);
  var sh=ss.getSheetByName(DATA_TAB);
  var vs=sh.getRange(2,11,sh.getLastRow()-1,1).getValues();
  for (var i=0;i<vs.length; i++) {
    if(String(vs[i][0]).indexOf('delete')!=-1) {
      vs[i][0]+=", removed";
    }
  }
  sh.getRange(2,11,vs.length,1).setValues(vs);
}
1 голос
/ 18 марта 2020

Я не проверял это, но я думаю, что это должно делать то, что вам нужно. Я прокомментировал каждую строку, чтобы помочь объяснить логи c.

. Вы можете написать все данные оптом, как я делал ниже, или написать их в l oop. Если вы собираетесь делать много записей / обновлений, тогда лучше делать массово.

function removeDeleted()
{
    // get the spreadsheet
    var ss = SpreadsheetApp.openById(BD_SPREADSHEET_ID);

    // get the sheet
    var dataSheet = ss.getSheetByName(DATA_TAB);

    // get the values of the data range as a 2D array
    var data = dataSheet.getDataRange().getValues();

    // first row (index = 0) is header
    // get the index of the column we want to check
    var columnToCheck = data[0].indexOf("COLUMN NAME");

    // track if any data is changed
    var dataChanged = false;

    // go through each row
    // skip the first row since its the header row
    for(var i = 1, numRows = data.length; i < numRows; ++i)
    {
        // get the cell value for the current row and column we want
        var cellValue = data[i][columnToCheck];

        // only if the cell value has delete in it
        if(cellValue.match(/delete/i))
        {
            // only if the cell value does not have removed in it
            if(!cellValue.match(/removed/i))
            {
                // update the value in the 2D array
                data[i][columnToCheck] += ", removed";

                // mark that data changed so we know to write it back to the sheet later
                dataChanged = true;
            }
        }
    }

    // only if data actually changed
    if(dataChanged)
    {
        // write it back to the sheet
        dataSheet.getDataRange().setValues(data);
    }
}
...