循环浏览Google电子表格中的工作表并使用getSheetName()

时间:2018-03-14 16:55:36

标签: google-apps-script google-sheets

我正在编写一个脚本来遍历一个电子表格中的每个工作表,并将特定单元格中的数据复制到另一个电子表格中的相应工作表中。我在下面的代码的第18行收到错误,但是声明它不能调用null的getLastRow方法。我使用了一些Logger.log行来检查我的变量,并看到targetSheet返回null。关于我出错的任何建议?

//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);
    }
  }    
}

1 个答案:

答案 0 :(得分:1)

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

  

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

     

如果多个工作表具有相同的名称,则返回最左边的工作表。如果没有具有给定名称的工作表,则返回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