我有这个脚本删除某些行,如果所选列中的选定单元格具有提到的内容,但我不知道它失败的地方
function DeleteRowByKeyword() {
var value_to_check = Browser.inputBox("Enter the keyword to trigger delete Row","", Browser.Buttons.OK);
// prendo quello attivo
var DATA_SHEET = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var FIRST_COLUMN = Browser.inputBox("Number of Column to look at (eg: for column A enter 1)","", Browser.Buttons.OK);
ss.toast("removing duplicates...","",-1);
var dataCopy1 = DATA_SHEET.getDataRange().getValues();
var deleted_rows = 0;
var rangeToCopy = '';
if (dataCopy1.length > 0) {
var i = 1;
while (i < DATA_SHEET.getMaxRows() - deleted_rows) {
if ((dataCopy1[i][FIRST_COLUMN]).search(value_to_check) != -1) {
ss.deleteRow(i);
deleted_rows++;
}
i++;
}
}
ss.toast("Done! " + deleted_rows + ' rows removed',"",5);
}
提前感谢任何帮助
答案 0 :(得分:3)
有一些事情需要改进:
请记住,电子表格行和列的编号从 1,适用于SpreadsheetApp中的所有方法,同时是javascript数组 从0开始编号。您需要在这些数字之间进行调整 与两者合作时的基础。
此处String.search()
方法可能不合适
两个原因。 .search()
将匹配子串,所以
('Testing').search('i')
找到匹配项;你可能想要找到确切的
相反。此外,.search()
包括对正则表达式的支持
匹配,因此用户可能会惊讶地发现他们的输入被解释
作为正则表达式; .indexOf()
可能是更好的选择。
要限制对包含数据的行的操作,请使用.getLastRow()
而不是.getMaxRows()
。
删除行时,将获得电子表格dataRange
的大小
小;你确实考虑到了这一点,但因为你正在循环
在最大尺寸下,代码因此要求而变得复杂。
您可以通过从最大值开始循环来简化操作。
列号的输入容易出错,因此请让用户输入 信件;你可以将它转换为数字。
您尚未为ss
定义值(在此函数中)。
这是更新后的代码:
function DeleteRowByKeyword() {
var value_to_check = Browser.inputBox("Enter the keyword to trigger delete Row", "", Browser.Buttons.OK);
var matchCol = Browser.inputBox("Column Letter to look at", "", Browser.Buttons.OK);
var FIRST_COLUMN = (matchCol.toUpperCase().charCodeAt(0) - 'A'.charCodeAt(0) + 1); // Convert, e.g. "A" -> 1
// prendo quello attivo (get active sheet)
var ss = SpreadsheetApp.getActiveSpreadsheet();
var DATA_SHEET = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
ss.toast("removing duplicates...", "", -1);
var dataCopy1 = DATA_SHEET.getDataRange().getValues();
var deleted_rows = 0;
if (dataCopy1.length > 0) {
var i = DATA_SHEET.getLastRow(); // start at bottom
while (i > 0) {
if (dataCopy1[i-1][FIRST_COLUMN-1] === value_to_check) {
ss.deleteRow(i);
deleted_rows++;
}
i--;
}
}
ss.toast("Done! " + deleted_rows + ' rows removed', "", 5);
}
答案 1 :(得分:1)
您需要确保删除索引是正确的索引。删除行时,所有波纹管行的索引都会更改为-1。 所以试试这段代码:
if (dataCopy1.length > 0) {
var i = 1;
while (i < DATA_SHEET.getMaxRows() - deleted_rows) {
if ((dataCopy1[i][FIRST_COLUMN]).search(value_to_check) != -1) {
ss.deleteRow(i - deleted_rows);
deleted_rows++;
}
i++;
}
}