Я пытаюсь завершить сценарий, который автоматически скрывает все строки, которые являются «ПУСТОЙ» кроме одного (Для ввода новых данных). На самом деле он у меня работает полностью, за исключением одной из моих страниц под названием «Список».
Если вы хотите увидеть мой лист для контекста, это редактируемая версия: 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)
}Это моя лучшая попытка, но она все еще не работает для листов без формул. Любая помощь будет оценена!
Почему все отрицательные, что я сделал не так?
Предоставьте минимальный воспроизводимый пример. Вы просто отбросили все в своем вопросе. Это должно быть минимальный воспроизводимый пример. Кроме того, вы смотрели на самые популярные вопросы / ответы в этом теге? stackoverflow.com/questions/4169914/…



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю, вы связываете себя узлами, пытаясь найти программный метод, который можно применить к электронной таблице, которая имеет так много разных форматов и настолько непоследовательна от листа к листу.
Электронная таблица также страдает от содержания избыточных данных, и время можно было бы лучше потратить на нормализацию данных (создание и использование основных файлов / списков данных) и связывание листов с использованием этих данных. «Реестр», например, может состоять почти исключительно из раскрывающихся списков.
Я использовал подход к созданию простых процедур, которые применяются к каждому листу или которые могут быть объединены с помощью функции 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);
}
Святая корова, я только что это видел, большое вам спасибо. Да, я пытался написать код для швейцарского армейского ножа, способного на все. Серьезно, это просто шокирует меня! Спасибо!
@pnuts Не могли бы вы взглянуть?