Google Sheets JavaScript - TypeError: Невозможно прочитать свойство 'getSheetName' из неопределенного - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть идентичный скрипт, работающий на трех листах Google, он прекрасно работает на двух из них, но на одном он просто не сгенерируется, но выдает следующее сообщение об ошибке:

TypeError: Невозможно прочитать свойство 'getSheetName' из неопределенного

Вот версия, с которой вы можете поиграть, если вам нравится

Вот скрипт:

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

1 Ответ

1 голос
/ 25 февраля 2020

В этой строке ниже все элементы null, поэтому вы получаете сообщение об ошибке TypeError: Cannot read property 'getSheetName' of undefined.

for ([i, sheet] in sheets)

Вы можете изменить for l oop например:

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, если вы хотите log a value, вы можете использовать Logger.log(value), и вы должны увидеть все зарегистрированные значения, если вы проверите Logs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...