Google App Script: поиск последней пустой строки - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь завершить сценарий, который автоматически скрывает все строки, которые являются «пустыми», кроме одной (для ввода новых данных).На самом деле у меня все работает, за исключением одной из моих страниц под названием «Ростер».

Если вы хотите просмотреть мой лист для контекста, это редактируемая версия: https://docs.google.com/spreadsheets/d/126hhh5su-WgHQQ_RmI8yvlrwITPeEIAegopHAooGaK0/edit?usp=sharing

Проблема с «Ростером» заключается в том, что мой скрипт проверяет наличие пустых строк, но не игнорирует формулы, которые оценивают как пустые.

Так вот мой «хидер». Это прекрасно работает За исключением с листами.с формулами, которые простираются до дна типа "= вывод! c1, c2, c3 и т. д ...

function HideRows(SheetName, FirstCol, LastCol, CopyOn) {
  // important variables
  var s = SpreadsheetApp.getActiveSpreadsheet(); // Calls Spreadsheet API
  // set's location for the code to work
  var Width = LastCol - FirstCol;
  // Sheetname called by function
  var sheet = s.getSheetByName(SheetName);
  // Gets total number of Rows and Cols
  var maxRow = sheet.getMaxRows();
  // Gets total Number of Rows and Cols That aren't BLANK
  var LastRow = sheet.getDataRange().getLastRow(); // Gets the total number of Rows with data
  var LastCol = sheet.getDataRange().getLastColumn(); // Gets the total number of Cols with data
  // Gets the Number of blank rows By subtracting the amount "BLANK" Rows from "ALL" Rows
  var numBlank = maxRow - LastRow; // Gets the difference between the Max and Last Row
  var blankRow = maxRow + 1 - numBlank;
  var numRows = numBlank - 1;
  var Blank = blankRow - LastRow;
  var On = CopyOn;
  // Checks For AutoFill Variable
  if (On) {
    CopyPaste(numBlank, LastRow, numRows, sheet, Width, Blank);
  } else {
    NoCopyPaste(sheet, LastRow, maxRow, numRows);
  }
}

function NoCopyPaste(sheet, LastRow, maxRow, numRows) {
  if (sheet.isRowHiddenByUser(LastRow)) {
    sheet.hideRows(maxRow + 1 - numRows, numRows);
    Logger.log(sheet.isRowHiddenByUser(LastRow));
  } else {
    sheet.showRows(LastRow + 1);
    sheet.hideRows(maxRow + 1 - numRows, numRows);
    Logger.log(sheet.isRowHiddenByUser(LastRow));
  }
}

function CopyPaste(numBlank, LastRow, numRows, sheet, Width, Blank) {
  if (numBlank < 1) {
    sheet.showRow(LastRow + 1);
    AutoFill(LastRow, FirstCol, Width);
  } else if (numBlank > 1) {
    sheet.hideRows(maxRow - numRows, numRows);
  } else if (numBlank === 1) {
    sheet.getRange(1, 1);
  }
}

function AutoFill(LastRow, FirstCol, Width) {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange("A1").offset(LastRow - 3, FirstCol, 1, Width).activate();
  var destinationRange = spreadsheet.getActiveRange().offset(0, 0, 3);
  spreadsheet.getActiveRange().autoFill(destinationRange, SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
  spreadsheet.getCurrentCell().offset(1, 0, 2, 4).activate();
}
HideRows("output", 0, 10, false);

Теперь я провел несколько исследований и нашел это замечательное решение от Жана Пьера: https://productforums.google.com/forum/#!topic/docs/-Xr6dud_Nak

Оно отлично работает для Ростера и правильно определяетПоследняя строка в листе, однако, находит неопределенные в тех листах, которые имеют только текстовый вывод и в конце есть пустые ячейки (без формул).

Я пытаюсь отредактировать оператор "for"нашел в этом ответе, чтобы он работал для обоих типов листов.

var SheetName = "output";
        function getData() {
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var sh = ss.getSheetByName(SheetName);
        var data = sh.getDataRange().getValues();
      
      var lastRow = getLastRow(data);
        Logger.log("Last Row is: " + lastRow);
        Logger.log(data);
      }
     
    function getLastRow(data) {
      for (var i = 0; i < data.length; i++) {
           var len = data[i].toString().replace(/,/g, "").length;
        Logger.log([i])
        if ( len === undefined){
           var lastRow = i + 1;
             break;
        } else if (len < 1) { 
             var lastRow = i;  
           }  
      }
      return lastRow;
      Logger.log(lastRow)
    }

Это моя лучшая попытка, но она все равно не работает для листов без формул.Любая помощь будет приветствоваться!

1 Ответ

0 голосов
/ 24 декабря 2018

Я думаю, что вы связываете себя узами, пытаясь найти программный метод для применения к электронной таблице, которая имеет так много разных форматов и настолько непоследовательна от листа к листу.

Электронная таблица также страдает от лишних данных, и лучше было бы потратить время на нормализацию данных (создание и использование основных файлов / списков данных) и связывание листов с использованием этих данных.Например, «список» может быть почти полностью составлен из выпадающих списков.

Я использовал подход, заключающийся в построении простых подпрограмм, которые применяются к каждому листу или которые можно объединить с помощью функции so_hide_Various дляобрабатывать все листы за один раз.

function so_hide_Various() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheetstuff = new Array;
    sheetstuff = [{
            sheetName: "output"
        },
        {
            sheetName: "Roster"
        }
    ];
    // Logger.log("sheetstuff rows: "+sheetstuff.length);// DEBUG
    for (var z = 0; z < sheetstuff.length; z++) {
        var sheet = ss.getSheetByName(sheetstuff[z].sheetName);
        switch (sheetstuff[z].sheetName) {
            case "output": // output style
                so_hide_Output();
                break;
            case "Roster": // Roster style
                so_hide_Roster();
                break;
        }
    }
}

function so_hide_Output() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var SheetName = "output";
    var sh = ss.getSheetByName(SheetName);
    var lrow = sh.getLastRow();
    var maxrow = sh.getMaxRows();
    //Logger.log("the last row is "+lrow+", and the max row is "+maxrow); // DEBUG
    var starthide = lrow + 2;
    sh.showRows(1, maxrow);
    sh.hideRows(starthide, maxrow - starthide + 1);
}

function so_hide_Roster() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var SheetName = "Roster";
    var sheet = ss.getSheetByName(SheetName);
    var Avals = sheet.getRange("B3:B").getValues();
    var Alast = Avals.filter(String).length;
    var maxrow = sheet.getMaxRows();
    var starthide = (Alast + 2 + 1 + 1); // add the two rows because of start on row 3 plus one blank row plus one for first hidden row
    //Logger.log("Alast = "+Alast+", starthide:= "+starthide+", and the max row is "+maxrow);//DEBUG
    var rowstodelete = maxrow - starthide + 1;
    sheet.showRows(1, maxrow);
    sheet.hideRows(starthide, rowstodelete);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...