Цель какая такого скроллинга? Быстро переместиться в конец данных и начать вводить новую строку? Если да, то чем не устраивает Ctrl-стрелка вниз? Если нет, то где по замыслу должна после скроллинга появляться последняя/новая строка - вверху или внизу экрана?
Цель какая такого скроллинга? Быстро переместиться в конец данных и начать вводить новую строку? Если да, то чем не устраивает Ctrl-стрелка вниз? Если нет, то где по замыслу должна после скроллинга появляться последняя/новая строка - вверху или внизу экрана?Gustav
где по замыслу должна после скроллинга появляться последняя/новая строка - вверху или внизу экрана?
А впрочем, не дожидаясь ответа, держите оба варианта скрипта - и внизу, и вверху: [vba]
Код
function scroll2top() { // экран прокручивается так, что последняя занятая строка данных // становится первой (ВВЕРХУ) видимой строкой на экране; // курсор становится в колонку A на следующей (второй, пустой) строке var sheet = SpreadsheetApp.getActiveSheet();
function scroll2bottom() { // экран прокручивается так, что последняя занятая строка данных // становится предпоследней (ВНИЗУ) видимой строкой на экране; // курсор становится в колонку A на следующей (последней, пустой) строке var sheet = SpreadsheetApp.getActiveSheet();
[/vba] Разумеется, указанное в комментариях поведение скролла будет выполняться при количестве заполненных строк в таблице более, чем на один экран по высоте. И при условии, что пустых строк внизу таблицы имеется ("зарезервировано") также в достаточном количестве (более одного экрана). Если данных будет меньше полного экрана, то поведение курсора по понятной причине будет несколько отличаться от описанного.
где по замыслу должна после скроллинга появляться последняя/новая строка - вверху или внизу экрана?
А впрочем, не дожидаясь ответа, держите оба варианта скрипта - и внизу, и вверху: [vba]
Код
function scroll2top() { // экран прокручивается так, что последняя занятая строка данных // становится первой (ВВЕРХУ) видимой строкой на экране; // курсор становится в колонку A на следующей (второй, пустой) строке var sheet = SpreadsheetApp.getActiveSheet();
function scroll2bottom() { // экран прокручивается так, что последняя занятая строка данных // становится предпоследней (ВНИЗУ) видимой строкой на экране; // курсор становится в колонку A на следующей (последней, пустой) строке var sheet = SpreadsheetApp.getActiveSheet();
[/vba] Разумеется, указанное в комментариях поведение скролла будет выполняться при количестве заполненных строк в таблице более, чем на один экран по высоте. И при условии, что пустых строк внизу таблицы имеется ("зарезервировано") также в достаточном количестве (более одного экрана). Если данных будет меньше полного экрана, то поведение курсора по понятной причине будет несколько отличаться от описанного.Gustav
Первая колонка содержит лишь дату и между датами есть по несколько пустых ячеек (первых в каждой строке) и надо нажать раз 20-30 чтобы в конце месяца попасть вниз. проще уж колесиком
Первая колонка содержит лишь дату и между датами есть по несколько пустых ячеек (первых в каждой строке) и надо нажать раз 20-30 чтобы в конце месяца попасть вниз. проще уж колесиком
не совсем понятно, как запускать его. при добавлении скрипта - в подменю СКРИПТЫ - его нет.
Ну, ёлка-палка! Заметьте, я работаю вслепую - не вижу ни Вашей таблицы-примера, ни Вашего пункта меню СКРИПТЫ. А также не знаю о том, что Вы не умеете добавлять функцию в меню, хотя могли бы - элементарно по аналогии с тем, как это сделано в той другой теме по Вашей же ссылке выше. Примерно вот так надо: [vba]
не совсем понятно, как запускать его. при добавлении скрипта - в подменю СКРИПТЫ - его нет.
Ну, ёлка-палка! Заметьте, я работаю вслепую - не вижу ни Вашей таблицы-примера, ни Вашего пункта меню СКРИПТЫ. А также не знаю о том, что Вы не умеете добавлять функцию в меню, хотя могли бы - элементарно по аналогии с тем, как это сделано в той другой теме по Вашей же ссылке выше. Примерно вот так надо: [vba]
Остался один вопрос. Можно ли "указать" скрипту какую колонку брать за "отчетную"? то есть можно ли скролить до первой пустой ячйеки в какой-то определенной колонке? или же скрипт работает только до первой пустой строки _полностью_ ?
Остался один вопрос. Можно ли "указать" скрипту какую колонку брать за "отчетную"? то есть можно ли скролить до первой пустой ячйеки в какой-то определенной колонке? или же скрипт работает только до первой пустой строки _полностью_ ?Dimansh
можно ли скролить до первой пустой ячйеки в какой-то определенной колонке?
Увы, это будет достаточно запарно. В таблицах Гугл нет аналога удобного и элегантного экселевского метода Range.End, поэтому скрипту придется в активной колонке вставать на последнюю строку всех имеющихся данных листа (sheet.getLastRow) и подниматься поячеечно вверх по активной колонке до встречи с первой непустой ячейкой. Я не говорю, что это невозможно в принципе, но требуется некоторое время - большее, чем потребовалось на предыдущие скрипты. Как только оно появится - что-нибудь предложу (или кто-нибудь другой раньше сделает).
В качестве же промежуточного варианта пока предлагаю заменить в предыдущих скриптах номер колонки 1 на номер колонки активной ячейки (активной - перед выполнением команды). Это не сложно. [vba]
Код
function scroll2top() { // экран прокручивается так, что последняя занятая строка данных ВСЕГО ЛИСТА // становится первой (ВВЕРХУ) видимой строкой на экране; // курсор становится в колонку активной ячейки на следующей (второй, пустой) строке // (поскольку последняя строка данных определяется по всем колонкам, а не только по текущей, // то после позиционирования ячейка выше может оказаться также пустой - тогда Ctrl-Up в помощь!) var sheet = SpreadsheetApp.getActiveSheet(); var activeColumn = sheet.getActiveCell().getColumn();
function scroll2bottom() { // экран прокручивается так, что последняя занятая строка данных ВСЕГО ЛИСТА // становится предпоследней (ВНИЗУ) видимой строкой на экране; // курсор становится в колонку активной ячейки на следующей (последней, пустой) строке // (поскольку последняя строка данных определяется по всем колонкам, а не только по текущей, // то после позиционирования ячейка выше может оказаться также пустой - тогда Ctrl-Up в помощь!) var sheet = SpreadsheetApp.getActiveSheet(); var activeColumn = sheet.getActiveCell().getColumn();
[/vba]И теперь, даже если после позиционирования на последнюю строку данных в этой колонке предыдущая ячейка выше окажется также пустой (одна или несколько), будет достаточно всего лишь ОДНОКРАТНОГО выполнения клавиатурной комбинации Ctrl-стрелка Вверх, чтобы оказаться на последней непустой ячейке текущей колонки.
можно ли скролить до первой пустой ячйеки в какой-то определенной колонке?
Увы, это будет достаточно запарно. В таблицах Гугл нет аналога удобного и элегантного экселевского метода Range.End, поэтому скрипту придется в активной колонке вставать на последнюю строку всех имеющихся данных листа (sheet.getLastRow) и подниматься поячеечно вверх по активной колонке до встречи с первой непустой ячейкой. Я не говорю, что это невозможно в принципе, но требуется некоторое время - большее, чем потребовалось на предыдущие скрипты. Как только оно появится - что-нибудь предложу (или кто-нибудь другой раньше сделает).
В качестве же промежуточного варианта пока предлагаю заменить в предыдущих скриптах номер колонки 1 на номер колонки активной ячейки (активной - перед выполнением команды). Это не сложно. [vba]
Код
function scroll2top() { // экран прокручивается так, что последняя занятая строка данных ВСЕГО ЛИСТА // становится первой (ВВЕРХУ) видимой строкой на экране; // курсор становится в колонку активной ячейки на следующей (второй, пустой) строке // (поскольку последняя строка данных определяется по всем колонкам, а не только по текущей, // то после позиционирования ячейка выше может оказаться также пустой - тогда Ctrl-Up в помощь!) var sheet = SpreadsheetApp.getActiveSheet(); var activeColumn = sheet.getActiveCell().getColumn();
function scroll2bottom() { // экран прокручивается так, что последняя занятая строка данных ВСЕГО ЛИСТА // становится предпоследней (ВНИЗУ) видимой строкой на экране; // курсор становится в колонку активной ячейки на следующей (последней, пустой) строке // (поскольку последняя строка данных определяется по всем колонкам, а не только по текущей, // то после позиционирования ячейка выше может оказаться также пустой - тогда Ctrl-Up в помощь!) var sheet = SpreadsheetApp.getActiveSheet(); var activeColumn = sheet.getActiveCell().getColumn();
[/vba]И теперь, даже если после позиционирования на последнюю строку данных в этой колонке предыдущая ячейка выше окажется также пустой (одна или несколько), будет достаточно всего лишь ОДНОКРАТНОГО выполнения клавиатурной комбинации Ctrl-стрелка Вверх, чтобы оказаться на последней непустой ячейке текущей колонки.Gustav
Что-то получилось. Увы, не без мыканий. Особенно хлопотной оказалась ситуация с загадочным фрагментом "sheet.getLastRow()*0" (читаем про него в комментариях и, если есть желание, проверяем всё самостоятельно).
По коду. Сначала обновляем функцию onOpen, придавая ей следующий вид - расширяем меню на две новые команды: [vba]
Код
function onOpen() {
var ui = SpreadsheetApp.getUi(); ui.createMenu('USER MENU') .addItem("Скроллинг ВВЕРХ" , 'scroll2top') .addItem("Скроллинг ВНИЗ" , 'scroll2bottom') .addItem("Скроллинг ВВЕРХ для колонки", 'scroll2top4column') .addItem("Скроллинг ВНИЗ для колонки" , 'scroll2bottom4column') .addToUi(); }
[/vba] И далее добавляем код для обработки двух новых команд - четыре взаимосвязанные функции: [vba]
Код
function scroll2top4column() { // экран прокручивается так, что строка с последней занятой ячейкой в текущем столбце // становится первой (ВВЕРХУ) видимой строкой на экране; // курсор становится в первую пустую ячейку ниже последней занятой в текущем столбце scroll4column(1); }
function scroll2bottom4column() { // экран прокручивается так, что строка с последней занятой ячейкой в текущем столбце // становится предпоследней (ВНИЗУ) видимой строкой на экране; // курсор становится в первую пустую ячейку ниже последней занятой в текущем столбце, // т.е. в последнюю видимую строку экрана scroll4column(0); }
function scroll4column(top) { var sheet = SpreadsheetApp.getActiveSheet(); var activeColumn = sheet.getActiveCell().getColumn();
var a = getLastRowInActiveColumn();
if (top) { sheet.setActiveRange(sheet.getRange(sheet.getMaxRows(), activeColumn)); sheet.setActiveRange(sheet.getRange(sheet.getLastRow()*0 + a, activeColumn)); } else { sheet.setActiveSelection(sheet.getRange(1, activeColumn)); } sheet.setActiveRange(sheet.getRange(sheet.getLastRow()*0 + a+1, activeColumn));
// выше бессмысленные на первый взгляд фрагменты sheet.getLastRow()*0 // являются эмпирически подобранным средством для правильной отработки прокрутки // в случае, когда параметр top = 1 (или true); // если удалить эти фрагменты, то поведение курсора при вызовах этой функции // вида scroll4column(1) и scroll4column(0) будет одинаковым и соответствовать // scroll4column(0), т.е. варианту "ВНИЗУ" (как в scroll2bottom4column) }
function getLastRowInActiveColumn() { var sheet = SpreadsheetApp.getActiveSheet(); var activeColumn = sheet.getActiveCell().getColumn();
// "половинное деление" var a = 1; var b = sheet.getLastRow(); while (a != b) { var range = sheet.getRange(a, activeColumn, b-a+1); if (range.isBlank()) { // диапазон полностью пустой - будем смотреть выше b = a; a = Math.round((1+a)/2); } else { // диапазон частично заполнен a = Math.round((a+b)/2); // b - остается тем же снизу, пытаемся сузиться до пустого диапазона внизу } }
// доводка мелкими шажками вверх от ранее вычисленного "грубого" номера строки a++; do { range = sheet.getRange(--a, activeColumn); } while (range.isBlank() && a > 1);
return a; // номер строки последней (самой нижней) непустой ячейки в активной колонке }
[/vba]
[p.s.]И напоминаю про восстановление форматирования кода скриптов после копирования к себе:
НА ЗАМЕТКУ: Форум пока не дает нормально форматировать текст скрипта, пробельные отступы в начале строк съедаются. Чтобы восстановить отступы надо после копирования кода к себе в Редактор скриптов выделить там скопированный текст (или сразу весь текст редактора - по Ctrl+A) и нажать комбинацию SHIFT+TAB.
Что-то получилось. Увы, не без мыканий. Особенно хлопотной оказалась ситуация с загадочным фрагментом "sheet.getLastRow()*0" (читаем про него в комментариях и, если есть желание, проверяем всё самостоятельно).
По коду. Сначала обновляем функцию onOpen, придавая ей следующий вид - расширяем меню на две новые команды: [vba]
Код
function onOpen() {
var ui = SpreadsheetApp.getUi(); ui.createMenu('USER MENU') .addItem("Скроллинг ВВЕРХ" , 'scroll2top') .addItem("Скроллинг ВНИЗ" , 'scroll2bottom') .addItem("Скроллинг ВВЕРХ для колонки", 'scroll2top4column') .addItem("Скроллинг ВНИЗ для колонки" , 'scroll2bottom4column') .addToUi(); }
[/vba] И далее добавляем код для обработки двух новых команд - четыре взаимосвязанные функции: [vba]
Код
function scroll2top4column() { // экран прокручивается так, что строка с последней занятой ячейкой в текущем столбце // становится первой (ВВЕРХУ) видимой строкой на экране; // курсор становится в первую пустую ячейку ниже последней занятой в текущем столбце scroll4column(1); }
function scroll2bottom4column() { // экран прокручивается так, что строка с последней занятой ячейкой в текущем столбце // становится предпоследней (ВНИЗУ) видимой строкой на экране; // курсор становится в первую пустую ячейку ниже последней занятой в текущем столбце, // т.е. в последнюю видимую строку экрана scroll4column(0); }
function scroll4column(top) { var sheet = SpreadsheetApp.getActiveSheet(); var activeColumn = sheet.getActiveCell().getColumn();
var a = getLastRowInActiveColumn();
if (top) { sheet.setActiveRange(sheet.getRange(sheet.getMaxRows(), activeColumn)); sheet.setActiveRange(sheet.getRange(sheet.getLastRow()*0 + a, activeColumn)); } else { sheet.setActiveSelection(sheet.getRange(1, activeColumn)); } sheet.setActiveRange(sheet.getRange(sheet.getLastRow()*0 + a+1, activeColumn));
// выше бессмысленные на первый взгляд фрагменты sheet.getLastRow()*0 // являются эмпирически подобранным средством для правильной отработки прокрутки // в случае, когда параметр top = 1 (или true); // если удалить эти фрагменты, то поведение курсора при вызовах этой функции // вида scroll4column(1) и scroll4column(0) будет одинаковым и соответствовать // scroll4column(0), т.е. варианту "ВНИЗУ" (как в scroll2bottom4column) }
function getLastRowInActiveColumn() { var sheet = SpreadsheetApp.getActiveSheet(); var activeColumn = sheet.getActiveCell().getColumn();
// "половинное деление" var a = 1; var b = sheet.getLastRow(); while (a != b) { var range = sheet.getRange(a, activeColumn, b-a+1); if (range.isBlank()) { // диапазон полностью пустой - будем смотреть выше b = a; a = Math.round((1+a)/2); } else { // диапазон частично заполнен a = Math.round((a+b)/2); // b - остается тем же снизу, пытаемся сузиться до пустого диапазона внизу } }
// доводка мелкими шажками вверх от ранее вычисленного "грубого" номера строки a++; do { range = sheet.getRange(--a, activeColumn); } while (range.isBlank() && a > 1);
return a; // номер строки последней (самой нижней) непустой ячейки в активной колонке }
[/vba]
[p.s.]И напоминаю про восстановление форматирования кода скриптов после копирования к себе:
НА ЗАМЕТКУ: Форум пока не дает нормально форматировать текст скрипта, пробельные отступы в начале строк съедаются. Чтобы восстановить отступы надо после копирования кода к себе в Редактор скриптов выделить там скопированный текст (или сразу весь текст редактора - по Ctrl+A) и нажать комбинацию SHIFT+TAB.