Функция скрипта Google Apps getActiveSheet () не возвращает активный лист - PullRequest
0 голосов
/ 27 октября 2018

Определение "активного листа" в Руководстве для разработчиков сценариев Google Apps :

Активным листом в электронной таблице является лист, отображаемый в пользовательском интерфейсе электронной таблицы.,

my sheets

Если у меня есть три листа по имени Мэри, Мо и Джо, и я оставляю лист Мэри на дисплее (следовательно, этоактивный лист) и запустите этот простой скрипт:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  Logger.log(sheet.getName());

  ss.setActiveSheet(ss.getSheets()[2]);
  Logger.log(ss.getActiveSheet().getName());
}

Я ожидаю, что результат скажет

[18-10-26 18:41:45:724 EDT] Mary
[18-10-26 18:41:45:730 EDT] Joe

Но, на самом деле, он говорит:

[18-10-26 18:49:14:752 EDT] Moe
[18-10-26 18:49:14:755 EDT] Joe

И если бы я запустил его второй раз, не касаясь листов, я бы ожидал, что результат выдаст:

[18-10-26 18:50:51:930 EDT] Joe
[18-10-26 18:50:51:933 EDT] Joe

Но на самом деле он говорит то же самое, что и раньше

[18-10-26 18:50:51:930 EDT] Moe
[18-10-26 18:50:51:933 EDT] Joe

Другими словамиустановка активного листа действительно изменяет лист, отображаемый в пользовательском интерфейсе электронной таблицы, но, похоже, он не регистрирует новый лист как активный лист.GAS всегда распознает Мо как активный лист, даже после установки другого листа на активный лист.

Буду признателен за объяснение и способ решения этой проблемы.По сути, мне просто нужны getActiveSheet() и getActiveRange() (с похожими проблемами), чтобы дать мне лист, который в данный момент отображается в пользовательском интерфейсе электронных таблиц, точно так, как определено в Руководстве разработчика.

Редактировать: я нашелрешение этой проблемы.Я цитирую себя из комментариев.

Привет всем, спасибо всем за ваш вклад.Я только что обнаружил, что getActiveSheet () действительно работает так, как я надеялся, но только если вы запускаете функцию через пользовательский интерфейс меню, созданный с использованием SpreadsheetApp.getUi (). CreateMenu (...), для которого требуется onOpen () триггер (спасибо @I '-' I за этот совет).Запуск функции из редактора сценариев вызывает проблемы, которые вдохновили мое первоначальное сообщение.

Однако, хотя я рад, что нашел решение, это больше похоже на обходной путь, оставляющий основную проблему нерешенной.Мне кажется, что getActiveSheet() должен действовать так, как определено в Руководстве разработчика в обоих случаях, в интерфейсе меню и редакторе сценариев.Не имеет смысла, что это работает в одном и не работает в другом.

1 Ответ

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

Отображение всех листов в течение 10 секунд

Этот сценарий будет циклически перебирать все листы в электронной таблице, активируя их по одному и отображая их в течение приблизительно 10 секунд.

function cycleThroughAllSheets() {
  var ss=SpreadsheetApp.getActive();
  var shA=ss.getSheets();
  var start=new Date();
  for(var i=0;i<shA.length;i++){
    shA[i].activate();
    SpreadsheetApp.flush();
    ss.toast('Active Sheet is ' + shA[i].getName());
    do{
      //nothing
    }while(new Date().valueOf()-start.valueOf()<10000);
    start=new Date();
  }
  ss.toast('End of Script.')
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...