Как я могу найти местоположение кнопки в электронной таблице с помощью Google Apps Script?

#google-apps-script #google-sheets

#google-apps-script #Google-Sheets

Вопрос:

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

Вот как я настроил свой лист: https://docs.google.com/spreadsheets/d/19wRj1zPGf1hm8PDUYtEF2XUxirhk2lIJbHAZF9e9YqE

Есть ли лучший способ сделать это? Я поиграл с NOW() формулой, но она обновляется каждый раз, когда я делаю что-то еще на листе. Это могло бы быть жизнеспособным вариантом, если бы я мог каким-то образом заставить его оставаться неизменным.

Комментарии:

1. ваш заголовок и описание кажутся совершенно не связанными?

2. Я не знаю, что такое «местоположение чертежа», но вы должны иметь возможность использовать now() с CopyTo с аргументом типа: source.CopyTo(ss.getRange(‘A1’), {contentsOnly: true});

3. @Baby_Boy, я обновил заголовок и описание вопроса. Надеюсь, это прояснит то, что я ищу.

Ответ №1:

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

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

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

Пример кода:

 function onEdit(e) {
  
  const sheet = e.source.getActiveSheet();
  const cell = e.range
  
  // Check if checkbox was checked and there is no time-entry yet
  if (cell.isChecked() == true amp;amp; cell.offset(0,-1).isBlank()){
    
    //Include time entry on the left side of the checkbox
    //var date = Utilities.formatDate(new Date(), 'America/Los_Angeles', 'MMMM dd, yyyy HH:mm:ss Z');
    var date = Utilities.formatDate(new Date(), 'America/Los_Angeles', 'HH:mm:ss Z');
    cell.offset(0,-1).setValue(date);
    
    // Uncheck the checkbox
    cell.setValue(false);
  } else if (cell.isChecked() == true) {
    // Uncheck the checkbox
    cell.setValue(false);
  }
}
 

Вы можете изменить формат вашей временной метки в зависимости от ваших предпочтений. В этом примере я отображал только текущее время. См. раздел Работа с датами и временем

Вывод:

введите описание изображения здесь

Я сбрасываю флажок после установки метки времени.

Комментарии:

1. Это идеально! Спасибо!