Использование onEdit с общей электронной таблицей Google Sheets, которая собирает информацию с одного листа и устанавливает значение на другом листе, ограничивая при этом других пользователей. - PullRequest
0 голосов
/ 11 мая 2019

У меня есть сценарий Time Out / Time In, над которым я работаю уже несколько недель.Я очень новый, поэтому потребовалось много исследований и помощи.Сейчас сценарий работает так, как задумано, но я хотел использовать Google Sheets специально для того, чтобы делиться листами с другими аккаунтами.Идея состоит в том, что один компьютер будет хостом и просто подготовит листы для сбора данных.На другом компьютере, давайте назовем их, Клиенты выбирают местоположения через выпадающий список в Колонке C или вводят местоположения в Колонке C. Функция onEdit активируется, только если Колонка C была отредактирована на листе ACTIVE. (Лист, предназначенный для использованияклиенты) После того, как они что-то изменили, onEdit использует, если столбец C равен определенным вещам, затем запускает другую функцию, которая вставляет информацию в лист PASSIVE.возможность редактировать что-либо на листе PASSIVE.Один из способов сделать это - использовать Google Sheets, чтобы просто защитить лист PASSIVE от других пользователей, но когда я делал это, каждый раз, когда они редактировали столбец C, эта функция не воспроизводилась.Возможно, потому что скрипт не может вставить в защищенный лист?Я подумал, что случится так, что, отредактировав столбец C на клиентском компьютере, он также отредактирует столбец C на хост-компьютере, и на хост-компьютере будет активирована функция onEdit.Но, видимо, функции onEdit активируются, только если они редактируются вручную, установка значений через скрипт не обрезает их.Я ошибся?

Еще одна вещь, которую я сделал - это скрыть лист PASSIVE, но оставил его редактируемым, это сработает, но они все равно могут просто щелкнуть мышью по представлению и открыть его снова.Есть ли способ предотвратить это?

Я пытаюсь сделать этот скрипт неразборчивым с клиентского компьютера.

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

function onEdit(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
   var row = getCurrentRow()
   var Location = getValue('ACTIVE!C' + row)
   var firstName = getValue('ACTIVE!A' + row)
   var lastName = getValue('ACTIVE!B' + row)
  var passiveRow = findRows(1,firstName,2,lastName,5,"",'PASSIVE');

  if(SpreadsheetApp.getActiveSheet().getName() !== "ACTIVE") return;

  if(Location !== 'OFFICE' && Location !== ""  && passiveRow !== "") {
    timeIn();
    places();

    Logger.log(passiveRow)
}

    else if(Location !== 'OFFICE' && Location !== ""  && passiveRow == "") {
    places();

    Logger.log(passiveRow)
}

     else if(Location === 'OFFICE') {
    timeIn();
}

}

The findRows"функция - это функция, которая находит строку внутри скрипта PASSIVE, которая соответствует критериям, и дает мне строку для размещения функции TimeIn.

В конце концов, мне все равно, какой метод используется,может быть, есть лучший, о котором я не думаю.Способ удержать Клиента от редактирования листа PASSIVE, но он все еще может Редактировать лист ACTIVE, и код будет работать правильно.

1 Ответ

0 голосов
/ 11 мая 2019

На моем рабочем месте работает аналогичная система для входа / выхода. Вот как мы это сделали:

  • Вместо использования простого триггера onEdit () используйте устанавливаемый триггер редактирования на листе клиента (с помощью параметра меню текущих триггеров проекта). Сделайте это с вашей учетной записью. enter image description here

  • Создать другую электронную таблицу хоста. (Клиентской учетной записи Gmail не требуется доступ для редактирования к электронной таблице хоста.)

  • Пусть функция на листе клиента добавит нужную информацию в электронную таблицу хоста. Пример кода:
    function onEdited() {
      SpreadsheetApp.openById("host spreadsheet id").appendRow(["this function 
      ran"]);
    }
  • Поделиться клиентом с клиентом. Когда они внесут изменения, ваша функция запустится и обновит электронную таблицу хоста.

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

...