有没有一种有效的方法可以在 google 应用程序脚本的单元格列中搜索和附加字符串?

Is there an efficient way to search for and append a string within a column of cells in google apps script?

正如标题所说,我目前正在 运行我认为可以更高效的功能。

基本上,我在我的 spreadsheet 中有一列 (k),我要在其中查找文本 "delete"。如果找到该文本,那么我只需附加 ", removed" 给它。这让 Appsheet 运行 关闭传播 sheet 知道如果它看到文本 "removed".

则不显示该行

例如,在函数 运行 之后,col k 的随机行可能如下所示: delete, completed, removed

这里的问题是我们的 sheet 有 4000 行,需要 1000 秒以上才能完成。当然,必须有一种更快的方法来搜索和附加文本,而不是通过 for 循环对 sheet 中的每一行进行迭代。

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 应用程序脚本和 spreadsheet 集成,所以我感觉这两个 for 循环可能有些冗余。任何帮助将不胜感激。

我还没有对此进行测试,但我认为这应该可以满足您的需求。我对每一行都进行了注释以帮助解释其中的逻辑。

您可以批量写入所有数据,就像我在下面所做的那样,或者在循环中写入。如果您要进行很多 writes/updates,那么批量进行会更好。

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

我会这样做:

一读。一写。

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