有没有一种有效的方法可以在 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);
}
正如标题所说,我目前正在 运行我认为可以更高效的功能。
基本上,我在我的 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);
}