2016-08-18 3 views
0

По сути, у меня есть несколько листов со следующей установкой:Google листы, активизирует диапазон верхней левой ячейки окна

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

function goToToday() { 
    var workbook = SpreadsheetApp.getActiveSpreadsheet() 
    var currentSheet = workbook.getActiveSheet().getName(); 
    if (currentSheet !== "Calculations") { 
    workbook.getSheetByName(currentSheet).setActiveRange(workbook.getSheetByName(currentSheet).getRange(1,1)) 
    var today = new Date() 
    var rowNumber = 4 
    var numOfRows = workbook.getSheetByName(currentSheet).getLastRow() - 3 
    var dates = workbook.getSheetByName(currentSheet).getRange(4,1,numOfRows,1).getValues() 
    for(i = 0; i < numOfRows; i++) { 
     if(dates[i][0] > today) { 
     break 
     } 
     else { 
     rowNumber++ 
     } 
    } 
workbook.getSheetByName(currentSheet).getRange(rowNumber, 1).activate() 
    } 
} 

Что мне пристанет, если активная ячейка перед запуском функции является ниже возвращаемых «сегодня» клетка функции, клетка возвращается в верхней левой ячейке в окне, который идеально подходит. Если, однако, текущая активная ячейка равна выше возвращенной ячейке, ячейка возвращается в нижней части окна. Как я могу заставить функцию возвращать ячейку последовательно, как верхнюю левую ячейку окна? Я предполагаю, что это имеет какое-то отношение к прокрутке.

+0

Почему вы устанавливаете активный диапазон в ячейку A1? Изменяет ли результат вообще? – HardScale

ответ

0
function goToToday() { 
    var workbook = SpreadsheetApp.getActiveSpreadsheet(), 
     currentSheet = workbook.getActiveSheet(); 
    if (currentSheet.getName() !== "Calculations") { 
    var lastCell = currentSheet.getRange(
      currentSheet.getMaxRows(),getMaxColumns() 
    ); 
    currentSheet.setActiveRange("A1"); 
    var today = new Date(), 
     rowNumber = 4, 
     numOfRows = currentSheet.getLastRow() - 3, 
     dates = currentSheet.getRange(4,1,numOfRows,1).getValues(); 
    for(i = 0; i < numOfRows; i++) { 
     if(dates[i][0] > today) { 
     break 
     } 
     else { 
     rowNumber++ 
     } 
    } 
    currentSheet.setActiveRange(lastcell); 
    SpreadsheetApp.flush(); 
    currentSheet.getRange(rowNumber, 1).activate() 
    } 
} 

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

РЕДАКТИРОВАТЬ: В процессе рефакторинга кода OP я переместил вызов на .getName() в условное обозначение и просто сохранил лист в currentSheet. Это устранило несколько вызовов до worksheet.getSheetByName(currentSheet). Здесь не очень-то много, но в более крупном сценарии время работы будет страдать. И, ИМО, его легче читать.

+0

Мне пришлось изменить несколько вещей, главным образом вокруг использования переменной currentSheet, но в принципе ваше решение сработало, спасибо! Для справки здесь приведен код функционирования: EDIT: Слишком долго для комментариев! :/ – TBear

+0

Я использовал переменную currentSheet для хранения самого листа, чтобы устранить множественные вызовы .getSheetByName (currentSheet). Вам нужно только одно имя листа, чтобы убедиться, что вы не находитесь в листе «Расчеты». – HardScale

+0

Если у вас есть решение, отправьте его в качестве ответа. Я хотел бы видеть ваш код, и я могу отредактировать его, чтобы он работал. Я бы предпочел не иметь ответа, у которого есть код, который не работает, особенно если он помечен правильно. – HardScale

0

Я не думаю, что это методы в Google Apps Script, которые могут управлять прокруткой, вы можете request a new feature.

Обходной путь (не самый лучший) заключается в использовании hideRows() и сразу же позвонить showRows(), что сделает пользовательский интерфейс «прокрутки». Пример предполагая, что первый ряд заморожен:

function myFunction() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getSheets()[0]; 
sheet.hideRows(2, 199); 
sheet.showRows(2, 199); 
sheet.getRange(200, 2).activate(); 
} 
0

Адаптация решения HardScale, я получил это для работы. Я не очень хорошо написана, и я уверен, что есть много способов «утонуть», так сказать, но это работает!

function goToToday() { 
    var workbook = SpreadsheetApp.getActiveSpreadsheet() 
    var currentSheet = workbook.getActiveSheet().getName(); 
    if (currentSheet !== "Calculations") { 
    var lastCell = workbook.getSheetByName(currentSheet).getRange(workbook.getSheetByName(currentSheet).getMaxRows(),workbook.getSheetByName(currentSheet).getMaxColumns()); 
    workbook.getSheetByName(currentSheet).setActiveRange(workbook.getSheetByName(currentSheet).getRange(1,1)) 
    var today = new Date() 
    var rowNumber = 4 
    var numOfRows = workbook.getSheetByName(currentSheet).getLastRow() - 3 
    var dates = workbook.getSheetByName(currentSheet).getRange(4,1,numOfRows,1).getValues() 
    for(i = 0; i < numOfRows; i++) { 
     if(dates[i][0] > today) { 
     break 
     } 
     else { 
     rowNumber++ 
     } 
    } 
    workbook.getSheetByName(currentSheet).setActiveRange(lastCell); 
    SpreadsheetApp.flush(); 
workbook.getSheetByName(currentSheet).getRange(rowNumber, 1).activate() 
    } 
} 
Смежные вопросы