Я пытаюсь завершить сценарий, который автоматически скрывает все строки, которые являются «пустыми», кроме одной (для ввода новых данных).На самом деле у меня все работает, за исключением одной из моих страниц под названием «Ростер».
Если вы хотите просмотреть мой лист для контекста, это редактируемая версия: 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)
}
Это моя лучшая попытка, но она все равно не работает для листов без формул.Любая помощь будет приветствоваться!