Цель какая такого скроллинга? Быстро переместиться в конец данных и начать вводить новую строку? Если да, то чем не устраивает Ctrl-стрелка вниз? Если нет, то где по замыслу должна после скроллинга появляться последняя/новая строка - вверху или внизу экрана?
Цель какая такого скроллинга? Быстро переместиться в конец данных и начать вводить новую строку? Если да, то чем не устраивает Ctrl-стрелка вниз? Если нет, то где по замыслу должна после скроллинга появляться последняя/новая строка - вверху или внизу экрана?Gustav
где по замыслу должна после скроллинга появляться последняя/новая строка - вверху или внизу экрана?
А впрочем, не дожидаясь ответа, держите оба варианта скрипта - и внизу, и вверху:
function scroll2top() {
// экран прокручивается так, что последняя занятая строка данных
// становится первой (ВВЕРХУ) видимой строкой на экране;
// курсор становится в колонку A на следующей (второй, пустой) строке
var sheet = SpreadsheetApp.getActiveSheet();
function scroll2bottom() {
// экран прокручивается так, что последняя занятая строка данных
// становится предпоследней (ВНИЗУ) видимой строкой на экране;
// курсор становится в колонку A на следующей (последней, пустой) строке
var sheet = SpreadsheetApp.getActiveSheet();
Разумеется, указанное в комментариях поведение скролла будет выполняться при количестве заполненных строк в таблице более, чем на один экран по высоте. И при условии, что пустых строк внизу таблицы имеется ("зарезервировано") также в достаточном количестве (более одного экрана). Если данных будет меньше полного экрана, то поведение курсора по понятной причине будет несколько отличаться от описанного.
где по замыслу должна после скроллинга появляться последняя/новая строка - вверху или внизу экрана?
А впрочем, не дожидаясь ответа, держите оба варианта скрипта - и внизу, и вверху:
function scroll2top() {
// экран прокручивается так, что последняя занятая строка данных
// становится первой (ВВЕРХУ) видимой строкой на экране;
// курсор становится в колонку A на следующей (второй, пустой) строке
var sheet = SpreadsheetApp.getActiveSheet();
function scroll2bottom() {
// экран прокручивается так, что последняя занятая строка данных
// становится предпоследней (ВНИЗУ) видимой строкой на экране;
// курсор становится в колонку A на следующей (последней, пустой) строке
var sheet = SpreadsheetApp.getActiveSheet();
Разумеется, указанное в комментариях поведение скролла будет выполняться при количестве заполненных строк в таблице более, чем на один экран по высоте. И при условии, что пустых строк внизу таблицы имеется ("зарезервировано") также в достаточном количестве (более одного экрана). Если данных будет меньше полного экрана, то поведение курсора по понятной причине будет несколько отличаться от описанного.Gustav
Первая колонка содержит лишь дату и между датами есть по несколько пустых ячеек (первых в каждой строке) и надо нажать раз 20-30 чтобы в конце месяца попасть вниз. проще уж колесиком
Первая колонка содержит лишь дату и между датами есть по несколько пустых ячеек (первых в каждой строке) и надо нажать раз 20-30 чтобы в конце месяца попасть вниз. проще уж колесиком
не совсем понятно, как запускать его. при добавлении скрипта - в подменю СКРИПТЫ - его нет.
Ну, ёлка-палка! Заметьте, я работаю вслепую - не вижу ни Вашей таблицы-примера, ни Вашего пункта меню СКРИПТЫ. А также не знаю о том, что Вы не умеете добавлять функцию в меню, хотя могли бы - элементарно по аналогии с тем, как это сделано в той другой теме по Вашей же ссылке выше. Примерно вот так надо:
не совсем понятно, как запускать его. при добавлении скрипта - в подменю СКРИПТЫ - его нет.
Ну, ёлка-палка! Заметьте, я работаю вслепую - не вижу ни Вашей таблицы-примера, ни Вашего пункта меню СКРИПТЫ. А также не знаю о том, что Вы не умеете добавлять функцию в меню, хотя могли бы - элементарно по аналогии с тем, как это сделано в той другой теме по Вашей же ссылке выше. Примерно вот так надо:
Остался один вопрос. Можно ли "указать" скрипту какую колонку брать за "отчетную"? то есть можно ли скролить до первой пустой ячйеки в какой-то определенной колонке? или же скрипт работает только до первой пустой строки _полностью_ ?
Остался один вопрос. Можно ли "указать" скрипту какую колонку брать за "отчетную"? то есть можно ли скролить до первой пустой ячйеки в какой-то определенной колонке? или же скрипт работает только до первой пустой строки _полностью_ ?Dimansh
можно ли скролить до первой пустой ячйеки в какой-то определенной колонке?
Увы, это будет достаточно запарно. В таблицах Гугл нет аналога удобного и элегантного экселевского метода Range.End, поэтому скрипту придется в активной колонке вставать на последнюю строку всех имеющихся данных листа (sheet.getLastRow) и подниматься поячеечно вверх по активной колонке до встречи с первой непустой ячейкой. Я не говорю, что это невозможно в принципе, но требуется некоторое время - большее, чем потребовалось на предыдущие скрипты. Как только оно появится - что-нибудь предложу (или кто-нибудь другой раньше сделает).
В качестве же промежуточного варианта пока предлагаю заменить в предыдущих скриптах номер колонки 1 на номер колонки активной ячейки (активной - перед выполнением команды). Это не сложно.
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();
И теперь, даже если после позиционирования на последнюю строку данных в этой колонке предыдущая ячейка выше окажется также пустой (одна или несколько), будет достаточно всего лишь ОДНОКРАТНОГО выполнения клавиатурной комбинации Ctrl-стрелка Вверх, чтобы оказаться на последней непустой ячейке текущей колонки.
можно ли скролить до первой пустой ячйеки в какой-то определенной колонке?
Увы, это будет достаточно запарно. В таблицах Гугл нет аналога удобного и элегантного экселевского метода Range.End, поэтому скрипту придется в активной колонке вставать на последнюю строку всех имеющихся данных листа (sheet.getLastRow) и подниматься поячеечно вверх по активной колонке до встречи с первой непустой ячейкой. Я не говорю, что это невозможно в принципе, но требуется некоторое время - большее, чем потребовалось на предыдущие скрипты. Как только оно появится - что-нибудь предложу (или кто-нибудь другой раньше сделает).
В качестве же промежуточного варианта пока предлагаю заменить в предыдущих скриптах номер колонки 1 на номер колонки активной ячейки (активной - перед выполнением команды). Это не сложно.
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();
И теперь, даже если после позиционирования на последнюю строку данных в этой колонке предыдущая ячейка выше окажется также пустой (одна или несколько), будет достаточно всего лишь ОДНОКРАТНОГО выполнения клавиатурной комбинации Ctrl-стрелка Вверх, чтобы оказаться на последней непустой ячейке текущей колонки.Gustav
Что-то получилось. Увы, не без мыканий. Особенно хлопотной оказалась ситуация с загадочным фрагментом "sheet.getLastRow()*0" (читаем про него в комментариях и, если есть желание, проверяем всё самостоятельно).
По коду. Сначала обновляем функцию onOpen, придавая ей следующий вид - расширяем меню на две новые команды:
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('USER MENU')
.addItem("Скроллинг ВВЕРХ" , 'scroll2top')
.addItem("Скроллинг ВНИЗ" , 'scroll2bottom')
.addItem("Скроллинг ВВЕРХ для колонки", 'scroll2top4column')
.addItem("Скроллинг ВНИЗ для колонки" , 'scroll2bottom4column')
.addToUi();
}
И далее добавляем код для обработки двух новых команд - четыре взаимосвязанные функции:
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; // номер строки последней (самой нижней) непустой ячейки в активной колонке
}
Что-то получилось. Увы, не без мыканий. Особенно хлопотной оказалась ситуация с загадочным фрагментом "sheet.getLastRow()*0" (читаем про него в комментариях и, если есть желание, проверяем всё самостоятельно).
По коду. Сначала обновляем функцию onOpen, придавая ей следующий вид - расширяем меню на две новые команды:
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('USER MENU')
.addItem("Скроллинг ВВЕРХ" , 'scroll2top')
.addItem("Скроллинг ВНИЗ" , 'scroll2bottom')
.addItem("Скроллинг ВВЕРХ для колонки", 'scroll2top4column')
.addItem("Скроллинг ВНИЗ для колонки" , 'scroll2bottom4column')
.addToUi();
}
И далее добавляем код для обработки двух новых команд - четыре взаимосвязанные функции:
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; // номер строки последней (самой нижней) непустой ячейки в активной колонке
}