L oop в одном и том же коде скрипта для двух указанных c вкладок, открывающих ту, в которой недавно были изменены - PullRequest
0 голосов
/ 10 марта 2020

На самом деле я не обладаю знаниями о сценариях, и я дошел до того, что в течение некоторого времени занимался поиском необходимых c кодов, которые мне нужны. Но я не думаю, что смогу сделать это сам, мне нужна помощь.

Я пробовал разные коды, которые могли бы удовлетворить мои потребности, и, наконец, нашел этот скрипт [t code / s:

    function onOpen() {
  // version 1.1, written by --Hyde 5 March 2020
  //  - add sheetName, dateColumn
  //  - use value.getTime to check that dateColumn contains dates
  //  - find today instead of tomorrow
  //  - use descriptive variable names
  //  - see https://support.google.com/docs/thread/32097728?msgid=32396362
  // version 1.0, written by AD:AM 15 May 2019
  //  - initial version
  //  - see https://support.google.com/docs/thread/6074864?msgid=6156095

  ////////////////////////////////
  // [START modifiable parameters]
  var sheetName = 'sheetname';
  var dateColumn = 2; // A = 1, B = 2, etc.
  // [END modifiable parameters]
  ////////////////////////////////

  var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
  var values = sheet.getDataRange().getValues();
  var now = new Date();
  var today = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
  for (var i = 0, length = values.length; i < length; i++) {
    var value = values[i][dateColumn - 1];
    if (value.getTime && value.getTime() >= today) {
      sheet.getRange(i + 1, dateColumn).activate();
      break;
    }
  }
}

Я попытался скопировать этот код и переименовать (имя листа) на 2 вкладки, которые мне нужны для этой функции, хотя она работает только одна или другая. Мне нужно, чтобы это работало на них обоих. Этот скрипт открывается до текущей даты, и я хочу, чтобы он работал на обеих вкладках, поскольку для двух вкладок назначен разный пользователь.

Здесь - копия моих листов для справки. .

Пожалуйста, помогите мне в этом, потому что я действительно не очень разбираюсь в том, как читать коды, я только исследую.

Спасибо

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Как отмечает Андрес, для активации листа, который был отредактирован совсем недавно, требуется, чтобы скрипт отслеживал редактирование событий. Однако функцию «переход к ячейке по дате» не следует запускать из функции onEdit (e), поскольку это приведет к тому, что выбор будет перемещаться при каждом редактировании электронной таблицы.

См. https://support.google.com/docs/thread/32097728?msgid=33126935 для решения, имеющего отдельную функцию saveLastEditedCellLocationPerSheet_ () для запуска из функции onEdit (e).

Cheers --Hyde

1 голос
/ 11 марта 2020

Вы не можете использовать более одного onOpen() триггера для каждого документа. Поскольку logi c в вашем коде уже работает для одного листа, вы можете изменить способ получения переменной sheet, например:

  var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);

На это:

  var sheet = SpreadsheetApp.getActiveSheet();

Метод getActiveSheet () извлекает лист, открываемый или редактируемый в данный момент.

Вам необходимо использовать триггер onEdit () , кроме Ваш onOpen() триггер активирует ячейку при редактировании листа. Я проверил этот код и успешно работал:

function onOpen() {
  activateLastDateCell();
}

function onEdit() {
  activateLastDateCell();
}

function activateLastDateCell() {
  // version 1.1, written by --Hyde 5 March 2020
  //  - add sheetName, dateColumn
  //  - use value.getTime to check that dateColumn contains dates
  //  - find today instead of tomorrow
  //  - use descriptive variable names
  //  - see https://support.google.com/docs/thread/32097728?msgid=32396362
  // version 1.0, written by AD:AM 15 May 2019
  //  - initial version
  //  - see https://support.google.com/docs/thread/6074864?msgid=6156095

  ////////////////////////////////
  // [START modifiable parameters]
  //var sheetName = '(Ian) Hulog - Hulog 2020';
  var dateColumn = 2; // A = 1, B = 2, etc.
  // [END modifiable parameters]
  ////////////////////////////////

  var sheet = SpreadsheetApp.getActiveSheet();
  var values = sheet.getDataRange().getValues();
  var now = new Date();
  var today = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
  for (var i = 0, length = values.length; i < length; i++) {
    var value = values[i][dateColumn - 1];
    if (value.getTime && value.getTime() >= today) {
      sheet.getRange(i + 1, dateColumn).activate();
      break;
    }
  }
}
...