【问题标题】:Looping through sheets in Google Spreadsheet and using getSheetName()循环浏览 Google 电子表格中的表格并使用 getSheetName()
【发布时间】:2018-03-15 01:16:11
【问题描述】:

我正在编写一个脚本来循环遍历一个电子表格中的每个工作表,并将特定单元格中的数据复制到另一个电子表格的相应工作表中。但是,我在以下代码的第 18 行收到错误,指出它无法调用 null 的 getLastRow 方法。我使用了几行 Logger.log 来检查我的变量并看到 targetSheet 返回为空。关于我做错了什么有什么建议吗?

//Export each sheet's daily data to another sheet *Test Version*
function exportReports() {
  var sourceSS = SpreadsheetApp.getActiveSpreadsheet();
  //Open Back Production Record *Test Version*
  var targetSS = SpreadsheetApp.openById("1ZJKZi-UXvqyGXW9V7KVx8whxulZmx0HXt7rmgIJpUY4");
  var allSourceSheets = sourceSS.getSheets();

  //For-Loop to loop through hourly production sheets, running the move data for-loop on each
  for(var s in allSourceSheets){

    var loopSheet = allSourceSheets[s];
    var loopSheetName = loopSheet.getSheetName();
    var targetSheet = targetSS.getSheetByName(loopSheetName);
    Logger.log(s);
    Logger.log(loopSheet);
    Logger.log(targetSheet);
    Logger.log(loopSheetName);
    var targetRow = targetSheet.getLastRow()+1;
    var currentDate = Utilities.formatDate(new Date(), "GMT-5", "MM/dd/yy");

    targetSheet.getRange(targetRow, 1).setValue(currentDate);
    //For-Loop to move data from source to target
    for(var i=6;i<=10;i++){
      var sourceRange = sourceSheet.getRange(i, 2);
      var targetRange = targetSheet.getRange(targetRow, i-4);
      var holder = sourceRange.getValue();

      targetRange.setValue(holder);
    }
  }    
}

【问题讨论】:

  • 如果把不推荐的for-in循环换成传统的索引循环,还有问题吗? stackoverflow.com/questions/500504/…
  • 谢谢;这对这个问题很有帮助,并且总体上提高了我的知识。非常感谢。

标签: google-apps-script google-sheets


【解决方案1】:

根据getSheetByName 上的文档,如果目标工作表名称不存在,那么您将获得null 作为返回值。

getSheetByName(name)
返回具有给定名称的工作表。

如果多个工作表具有相同的名称,则返回最左边的一个。如果没有给定名称的工作表,则返回 null。

因此,目标工作簿中不存在名称由 loopSheetName 指定的所需工作表。可能有人创建了新工作表,或重命名了源工作簿中的现有工作表。


您还没有问过这个问题,但是您也可以提高复制代码的性能,方法是将输入读取为多行范围数组,创建一个行数组来保存结果,然后编写一次:

var sourceData = sourceSheet.getRange(6, 2, 5, 1).getValues(); // (6,2) through (10, 2)
var output = [];
// Transpose row array to column array (could use other functions, but this is easier to understand)
for(var i = 0; i < sourceData.length; ++i) { output.push(sourceData[i][0]); }
targetSheet.getRange(targetRow, 2, 1, output.length).setValues([output]); // i0 = 6 -> 6 - 4 = 2

【讨论】:

  • 这是有道理的。在进一步查看我的代码后,根据您的观察,我意识到问题出在我的数组上。你的信息加上@tehhowch 的提示让我到达了我需要去的地方。并感谢内部 for 循环的提示;我也会将其合并,因为此脚本可以使用一些优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
相关资源
最近更新 更多