Прокрутите все рабочие таблицы до последней строки на открытой - PullRequest
0 голосов
/ 03 октября 2018

Я создал электронную таблицу, состоящую из 7 листов, каждый из которых заполнен множеством строк данных.Я устал от ручной прокрутки вниз до последней строки каждого листа, поэтому я создал простую функцию сценария для программного поиска и перехода к последней строке листа.Эта функция работает, по большей части, при запуске вручную.Однако, когда я попытался выполнить эту функцию с установленным триггером событий «Из таблицы, при открытии», он не срабатывает должным образом.

Вот функция:

function LastRowOnOpen() {
  var ss = SpreadsheetApp.getActive();
  var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('302 Ashfrd'));
   var lastRow = sheet.getLastRow();

   lastRow = lastRow + 5;
   sheet.getRange(lastRow, 1).activate();
   sheet.showSheet();

   var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('3220 Blmnt'));
   var lastRow = sheet.getLastRow();
   lastRow = lastRow + 5;
   sheet.getRange(lastRow, 1).activate();
   sheet.showSheet();

   var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('3302 Blmnt'));
   var lastRow = sheet.getLastRow();
   lastRow = lastRow + 5;
   sheet.getRange(lastRow, 1).activate();
   sheet.showSheet();

   var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('1035 Bnhm'));
   var lastRow = sheet.getLastRow();
   lastRow = lastRow + 5;
   sheet.getRange(lastRow, 1).activate();
   sheet.showSheet();

   var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('Deer Park'));
   var lastRow = sheet.getLastRow();
   lastRow = lastRow + 5;
   sheet.getRange(lastRow, 1).activate();
   sheet.showSheet();

   var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('3000-102 Lrn'));
   var lastRow = sheet.getLastRow();
   lastRow = lastRow + 5;
   sheet.getRange(lastRow, 1).activate();
   sheet.showSheet();

   var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('2249 Wht'));
   var lastRow = sheet.getLastRow();
   lastRow = lastRow + 5;
   sheet.getRange(lastRow, 1).activate();
   sheet.showSheet();  

PS

Я также пытался использовать цикл for, содержащий:

var sheet = SreadsheetApp.setActiveSheet(ss.getSheetByName('2249 Wht'));
var lastRow = sheet.getLastRow();
lastRow = lastRow + 5;
sheet.getRange(lastRow, 1).activate();
sheet.showSheet();   `   

, изменяющий метод sheet = getSheetByname для сокращения строк кода, однако все, кроме последней итерации цикла, игнорировались.

1 Ответ

0 голосов
/ 05 октября 2018

Нет хорошего ответа (который я мог бы найти), который бы полностью рассмотрел эту тему:

Проблема с вашим текущим сценарием, «игнорирующим» все, кроме последней итерации цикла, связана с внутренних оптимизаций Google службы электронных таблиц:

Сценарии обычно должны считывать данные из электронной таблицы, выполнять вычисления, а затем записывать результаты данных в электронную таблицу,В Google Apps Script уже есть некоторая встроенная оптимизация, например, использование упреждающего кэширования для получения того, что сценарий может получить, и запись в кеширование для сохранения того, что может быть установлено.

В другихсловами, ваш сценарий проанализирован и фактически необходим только последний вызов activate.Чтобы противостоять этому, мы используем SpreadsheetApp.flush() и Utilities.sleep, как сделано здесь .

function onOpen(e) { // "Simple Trigger" from reserved function name.
  // https://developers.google.com/apps-script/guides/triggers/events#open
  scrollAll(e.source);
}
function scrollAll(wb) {
  (wb ? wb : SpreadsheetApp.getActive()).getSheets().forEach(
    function (sheet) {
      wb.setActiveSheet(sheet).setActiveSelection("A" + sheet.getLastRow());
      SpreadsheetApp.flush();
      Utilities.sleep(1000); // may need to be adjusted
    });
}
function scrollActive() { // Macro target
  const s = SpreadsheetApp.getActiveSheet();
  s.setActiveSelection("A" + s.getLastRow());
}

Чтобы иметь сочетание клавишдля повторной прокрутки текущего листа в конец, вы должны включить в файл манифеста вашего проекта следующее, чтобы связать функцию scrollActive как макрос с сочетанием клавиш:

"sheets": {
  "macros": [{
    "menuName": "Scroll To Last Row",
    "functionName": "scrollActive",
    "defaultShortcut": "Ctrl+Alt+Shift+N" // N= 1, 2, 3, 4, 5, 6, 7, 8, 9, or 0
  }]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...