我试图在Google表格中识别某个范围内的多个条件。在识别该值后,脚本应该返回找到值的列,然后调用函数来删除列。以下是我放在一起的代码,但我遇到了问题。
我在删除过程中遇到了越界错误。
//Delete Column
function deleteColumn(col) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var numCol = sheet.getRange("A1:T23").getNumColumns();
var data = sheet.deleteColumn(col);
for (var i = numCol; i >= 0; i--) {
var remove = data;
Logger.log(remove + " was removed");
}
}
//find columns
function findColumn() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var data = sheet.getRange("A1:T23");
var values = data.getValues();
for (var i = 1; i < values.length; i++) {
for (var j = 0; j < values[i].length; j++) {
if (values[i][j] == "Notes" || values[i][j] == "Billable" || values[i][j] == "Total") {
var col = j+1;
Logger.log("columns numbers found" + col);
deleteColumn(col);
}
}
}
}
我的一部分想法是,当我开始删除时,我并没有完全发现。这有效地改变了列的数量,因此我尝试从列数开始并返回(从右到左)。
答案 0 :(得分:1)
越界错误是因为你的循环范围:
(var i = 1; i < values.length; i++)
values
数组从0开始,意味着它从0..values.length-1
索引。
您的一些陈述混淆了对象类型。总是仔细检查一下。
var data = sheet.deleteColumn(col);
您会看到deleteColumn()
返回Sheet
- 您已经拥有的同一张纸。这是为链接完成的,允许您在一个语句中对Sheet执行多个操作。您的变量名称暗示您希望收到已删除列的副本,并且您的log()
调用会尝试显示它...您可能因此而在日志中看到[object]
。
在删除行或列时,您可以倒计时。看起来你并没有在所有正确的地方做到这一点。
调用函数findColumn()
具有增加的循环(当删除列时将失去同步),而被调用函数deleteColumn()
具有递减循环(它可能不需要)在所有)。无论如何,为什么deleteColumn()
存在?如果它看起来像你想要的那样,它会删除你的所有数据。
最后,由于您要删除列,因此应使用外部循环遍历列。如果满足列删除的条件,则在行上方的内循环可以continue
d(退出)。你的意思是内圈吗?它在每一行中查找这三个值。如果你只想查看Headers,那就是第1行(数组中的索引0)。
function deleteNBTColumns() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var dataRange = sheet.getRange("A1:T23");
var data = sheet.getRange("A1:T23");
var values = data.getValues();
var numRows = values.length;
var numCols = values[0].length;
for (var col = numCols-1; col > 0; col--) { // count down over columns
for (var row = 0; row < numRows; row++) { // count up over rows
switch (values[row][col]) { // examine cell contents
case "Notes":
case "Billable":
case "Total": // in these cases...
sheet.deleteColumn(col+1); // delete column in sheet (1-based)
continue; // continue with next column
break; // can't get here, but good practice
}
}
}
}