根据单元格值删除列

时间:2014-07-21 15:18:14

标签: google-apps-script google-sheets

我试图在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);
      }
    }
  }
}

我的一部分想法是,当我开始删除时,我并没有完全发现。这有效地改变了列的数量,因此我尝试从列数开始并返回(从右到左)。

1 个答案:

答案 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
      }
    }
  }
}