Как установить таймер для строки в гугл листах - PullRequest
0 голосов
/ 04 апреля 2020

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

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

Может кто-нибудь подсказать мне, с чего начать или предложить расширение chrome для этого использования?

Вы также можете предложить мне, как создать расширение chrome, я могу попробовать его вместе со своими коллегами.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Проблема с защитой:

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

Ни владелец электронную таблицу или текущего пользователя нельзя удалить.

Использование oldValue:

Из-за этого лучшим способом для go было бы использование параметра oldValue из объект события onEdit .

Триггер onEdit запускается каждый раз, когда пользователь редактирует ячейку. В нем вы можете использовать:

  • PropertiesService для хранения полезной информации: (1) редактируется ли первый раз строка 1 (isNotFirstTime), и (2 ) когда в последний раз редактировалась первая строка (startTime).
  • Объект события для получения информации об отредактированной ячейке (ее строка, ее старое значение и т. д. c.) .

Вы можете сделать что-то по следующим строкам (проверить комментарии):

function onEdit(e) {
  var current = new Date(); // Current date
  var range = e.range;
  var editedRow = range.getRow();
  var sheet = range.getSheet();
  var props = PropertiesService.getScriptProperties();
  var waitingTime = 20 * 1000; // 20 seconds
  var isNotFirstTime = props.getProperty("isNotFirstTime"); // Check if first row was previously edited
  var startTime = new Date(props.getProperty("startTime")); // Time when first row was first edited
  if (editedRow === 1 && !isNotFirstTime) { // Check that (1) edited row is first one, (2) it was not edited before
    props.setProperty("startTime", current.toString()); // If it's first time first row was edited, store current time
    Utilities.sleep(waitingTime); // Wait for 20 seconds
    props.setProperty("isNotFirstTime", true); // Store: first row was previously edited
  }
  // Check that (1) second row edited, (2) Less than 20 seconds passed since first time first row was edited:
  if (editedRow === 2 && (current - startTime) < waitingTime) {
    range.setValue(e.oldValue || ""); // Set previous value to edited cell (this avoids editing cells)
  }
}

Ссылка:

0 голосов
/ 05 апреля 2020

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

function onEdit(e) {
  const sh=e.range.getSheet();
  const delay=20000;
  let ms=Number(new Date().valueOf()).toFixed();
  if(sh.getName()=='Sheet10') {
    const ps=PropertiesService.getScriptProperties();
    let dObj=ps.getProperties();
    if(dObj.hasOwnProperty('row') && dObj.hasOwnProperty('delay')) {
      if(dObj.row!=e.range.rowStart && Number(ms-dObj.delay)<delay) {
        e.range.setValue(e.oldValue);
        e.source.toast('Sorry you have ' + (delay-Number(ms-dObj.delay))/1000 + ' seconds left.');
      }else{
        ps.setProperties({'row':e.range.rowStart,'delay':ms});
      }    
    }else{
      ps.setProperties({'row':e.range.rowStart,'delay':ms});
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...