"对于" Google Script中的循环引入了TypeError

时间:2016-07-02 14:50:55

标签: google-apps-script google-sheets

我已经创建(实际上,修改过)一个脚本,用于导出Google表格中特定范围的CSV文件。它运作良好:

function convertRangeToCsvFile_(csvFileName,delimiter) {
  // Get the selected range in the spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var ws = sheet.getRange("F3:G501");

  try {
    var data = ws.getValues();
    var csvFile = undefined;

    // Loop through the data in the range and build a string with the CSV data
    if (data.length > 1) {
      var csv = "";
      for (var row = 0; row < data.length; row++) {
        for (var col = 0; col < data[row].length; col++) {
          if (data[row][col].toString().indexOf(delimiter) != -1) {
            data[row][col] = "\"" + data[row][col] + "\"";
          }
        }

        // Join each row's columns
        // Add a carriage return to end of each row, except for the last one
        if (row < data.length-1) {
          csv += data[row].join(delimiter) + "\r\n";
        }
        else {
          csv += data[row];
        }
      }
      csvFile = csv;
    }
    return csvFile;
  }
  catch(err) {
    Logger.log(err);
    Browser.msgBox(err);
  }
}

但是,我现在想要设置它,以便脚本迭代三个不同范围的单元格并将它们连接成一个大的长CSV。我尝试使用for循环执行此操作,但是当我这样做时,脚本会返回错误:

  

TypeError:无法在对象0中找到函数getValues。

据我所知,这可能是某种范围问题,但我不能为我的生活找到任何有助于我解决它的事情。这是我破碎的代码:

function convertRangeToCsvFile_(csvFileName,delimiter) {
  // Get the selected range in the spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var ranges = [sheet.getRange("F3:G501"),sheet.getRange("H3:I501"),sheet.getRange("J3:K501")];

  try {

    for (var ws in ranges) {

      var data = ws.getValues();
      var csvFile = undefined;

      // Loop through the data in the range and build a string with the CSV data
      if (data.length > 1) {
        var csv = "";
        for (var row = 0; row < data.length; row++) {
          for (var col = 0; col < data[row].length; col++) {
            if (data[row][col].toString().indexOf(delimiter) != -1) {
              data[row][col] = "\"" + data[row][col] + "\"";
            }
          }

          // Join each row's columns
          // Add a carriage return to end of each row, except for the last one
          if (row < data.length-1) {
            csv += data[row].join(delimiter) + "\r\n";
          }
          else {
            csv += data[row];
          }
        }
        csvFile = csv;
      }
    }  

    return csvFile;

  }
  catch(err) {
    Logger.log(err);
    Browser.msgBox(err);
  }
}

我已经尝试调整for循环开始和结束的位置(原来它没有进入var data = ws.getValues();行,这当然会导致&#34;未定义&#34;错误。)

但是尽管我付出了最大的努力,但我无法找到任何可以解决这个问题的信息,这些信息是我(非常缺乏经验)的大脑可以解析的!

非常感谢任何输入。

1 个答案:

答案 0 :(得分:1)

您将范围循环为对象而不是数组,因此您找到的第一个键是0

使用增量for循环循环:

var ws;
for (var w =0; w < ranges.length; w += 1) {
    ws = ranges[w];

剩下的我还没有检查,但如果你没有改变,其他任何事都应该没问题。