Google apps script 在Google电子表格中循环工作表并使用getSheetName()

Google apps script 在Google电子表格中循环工作表并使用getSheetName(),google-apps-script,google-sheets,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(

我正在编写一个脚本,循环浏览一个电子表格中的每个工作表,并将特定单元格中的数据复制到另一个电子表格中相应的工作表中。但是,我在下面代码的第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);
    }
  }    
}
//将每个工作表的每日数据导出到另一个工作表*测试版本*
函数exportReports(){
var sourceSS=SpreadsheetApp.getActiveSpreadsheet();
//开放式生产记录*测试版本*
var targetSS=SpreadsheetApp.openById(“1ZJKZi-UXvqyGXW9V7KVx8whxulZmx0HXt7rmgIJpUY4”);
var allSourceSheets=sourceSS.getSheets();
//对于每小时生产工作表中的循环,在每个工作表上运行循环的移动数据
用于(所有源表中的var s){
var loopSheet=allSourceSheets;
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(新日期(),“GMT-5”,“MM/dd/yy”);
targetSheet.getRange(targetRow,1).setValue(currentDate);
//For循环将数据从源移动到目标
对于(var i=6;i,根据上的文档,如果目标工作表名称不存在,则返回值为
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
var sourceData=sourceSheet.getRange(6,2,5,1).getValues();/(6,2)到(10,2)
var输出=[];
//将行数组转换为列数组(可以使用其他函数,但这更容易理解)
对于(var i=0;i6-4=2

如果您将不推荐的
for in
循环替换为传统的索引循环,您还有问题吗?谢谢;这对解决此问题很有帮助,并提高了我的总体知识。非常感谢。这很有意义。根据您的观察,在进一步研究我的代码后,我意识到问题出在我的a上rray。你的信息加上@tehhowch的提示让我找到了我需要去的地方。谢谢你关于内部for循环的提示;我也会将其合并,因为这个脚本可能需要一些优化。