【问题标题】:Google Sheets JavaScript - TypeError: Cannot read property 'getSheetName' of undefinedGoogle Sheets JavaScript - TypeError:无法读取未定义的属性“getSheetName”
【发布时间】:2020-06-09 04:18:27
【问题描述】:

我在三个谷歌表格上运行了一个相同的脚本,它在其中两个上运行良好,但在一个上它不会生成,不断向我抛出以下错误:

TypeError: 无法读取未定义的属性“getSheetName”

Here's a version that you can play around with if you like

这是脚本:

var masterSheetName = "GROUP 1";
var ignoreThisSheets=masterSheetName+ ",REFERENCE,";
var sortColumn=4;
var sortAscending = true;
function onOpen() {
    var ui = SpreadsheetApp.getUi();
    // Or DocumentApp or FormApp.
    ui.createMenu('Custom Menu')
        .addItem('Generate Master Sheet', 'menuItem1')
        .addToUi();

}

function menuItem1() {
  //  insertFinalSheet();
    collectDataFromSheets(masterSheetName);
}


function getRangeFromSheetsToCopy(thissheet, skipRows, skipCols) {
    return thissheet.getRange(skipRows, skipCols, thissheet.getLastRow(), thissheet.getLastColumn());
}

function insertFinalSheet() {
    var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var itt = activeSpreadsheet.getSheetByName(masterSheetName);

    if (itt) {
        activeSpreadsheet.deleteSheet(itt);
    }
    activeSpreadsheet.insertSheet(masterSheetName);
}


function collectDataFromSheets(masterSheetName) {

    var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheets = activeSpreadsheet.getSheets();
    var masterSheet = activeSpreadsheet.getSheetByName(masterSheetName);
var range = masterSheet.getRange(2,1,masterSheet.getLastRow(),masterSheet.getLastColumn());
range.clear();
    var colValues = [];
    var first = true;
        console.log("Sheets : " + sheets);
        console.log("activeSpreadsheet : " + activeSpreadsheet);

    for ([i, sheet] in sheets) {
               console.log("i : " + i);
 var sheetName = sheet.getSheetName();
        console.log("Working on sheet: " +sheetName);

      if(ignoreThisSheets.indexOf(sheetName)>= 0){
        console.log("Skipping sheet: " +sheetName);
        continue;
      } 

            var currentSheetRange;
            // Get the range of the sheet that is your paste target.
            var pasteRange;
            console.log('masterSheet.getLastRow() is:' + masterSheet.getLastRow())
            console.log('masterSheet.getLastColumn() is:' + masterSheet.getLastColumn())
            console.log('sheet.getLastRow() is:' + sheet.getLastRow())
            console.log('sheet.getLastColumn() is:' + sheet.getLastColumn())
     

              //  currentSheetRange = getRangeFromSheetsToCopy(sheet, 1, 1);
     currentSheetRange =   sheet.getRange(2, 1, getLastRow(sheet), sheet.getLastColumn());
          if(first)
                pasteRange = masterSheet.getRange(2,1);
          else
                pasteRange = masterSheet.getRange(getLastRow(masterSheet)+1, 1);
          
            var columnWidths = SpreadsheetApp.CopyPasteType.PASTE_NORMAL;
            currentSheetRange.copyTo(pasteRange);
            currentSheetRange.copyTo(pasteRange, columnWidths, false);

            first = false;
      
       masterSheet.getRange(2,1,masterSheet.getLastRow(),  masterSheet.getLastColumn()).sort({column: sortColumn, ascending: sortAscending});

       
    }

    return colValues;
}
function getLastRow(sheet){
         var Avals = sheet.getRange("A1:A").getValues();
                 console.log('Avals is:' + Avals)
 var Alast = Avals.filter(String).length;
                      console.log('Alast is:' + Alast);
  return Alast;
}

【问题讨论】:

    标签: javascript google-sheets google-java-format


    【解决方案1】:

    在下面这一行中,所有元素都是null,因此,这就是您收到TypeError: Cannot read property 'getSheetName' of undefined 错误消息的原因。

    for ([i, sheet] in sheets)
    

    您可以像这样更改for 循环:

    for (var i = 0; i < sheets.length; i++) {
        var sheetName = sheets[i].getSheetName();
        Logger.log("Working on sheet: " + sheetName);
    
        if (ignoreThisSheets.indexOf(sheetName) >= 0) {
            Logger.log("Skipping sheet: " + sheetName);
            continue;
        }
    
        var currentSheetRange;
        // Get the range of the sheet that is your paste target.
        var pasteRange;
        Logger.log('masterSheet.getLastRow() is:' + masterSheet.getLastRow())
        Logger.log('masterSheet.getLastColumn() is:' + masterSheet.getLastColumn())
        Logger.log('sheets[i].getLastRow() is:' + sheets[i].getLastRow())
        Logger.log('sheets[i].getLastColumn() is:' + sheets[i].getLastColumn())
    
    
        //  currentSheetRange = getRangeFromSheetsToCopy(sheet, 1, 1);
        currentSheetRange = sheets[i].getRange(2, 1, getLastRow(sheets[i]), sheets[i].getLastColumn());
        if (first)
            pasteRange = masterSheet.getRange(2, 1);
        else
            pasteRange = masterSheet.getRange(getLastRow(masterSheet) + 1, 1);
    
        var columnWidths = SpreadsheetApp.CopyPasteType.PASTE_NORMAL;
        currentSheetRange.copyTo(pasteRange);
        currentSheetRange.copyTo(pasteRange, columnWidths, false);
    
        first = false;
    
        masterSheet.getRange(2, 1, masterSheet.getLastRow(), masterSheet.getLastColumn()).sort({
            column: sortColumn,
            ascending: sortAscending
        });
    
    
    }
    
    

    此外,在Apps Script 中,如果你想logvalue,你可以使用Logger.log(value),如果你检查Logs,你应该会看到所有记录的值。

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 2019-01-29
      • 2015-06-08
      相关资源
      最近更新 更多