【问题标题】:"for" loop in Google Script introducing a TypeErrorGoogle Script 中的“for”循环引入了 TypeError
【发布时间】:2016-07-02 14:50:55
【问题描述】:

我创建了(实际上是修改了)一个脚本,用于为 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(); 行中,这当然会导致“未定义”错误。)

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

非常感谢任何意见。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

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

    使用增量 for 循环代替循环:

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

    其余的我没有检查,但如果你改变了其他什么都没有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      • 2022-01-19
      • 2021-12-14
      • 1970-01-01
      相关资源
      最近更新 更多