Проблемы с дублированными событиями при подключении Google Calendar и Google Sheet с использованием AppScript - PullRequest
0 голосов
/ 07 ноября 2019

Я успешно интегрировал GCalendar в Gsheet для создания событий. После отправки формы Google App Script отправляет приглашение в мой календарь и в мой гостевой календарь.

У меня проблемы с автоматизацией и дублированием записей. Скрипт не запускается, когда появляется новая строка - пробовал как при редактировании, так и при отправке формы - и когда я заставляю его запускаться, он перепланирует ВСЕ прошедшие события.

Вот мой код

function CreateEvent() {

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('functionSheet');
  var eventCal = CalendarApp.getCalendarById('name@email.com');
  var lr = spreadsheet.getLastRow();
  var count = spreadsheet.getRange("A2:N"+lr+"").getValues();

    for (x=0; x<count.length; x++) {

      var shift = count[x];

      var summary = shift[2];
      var startTime = shift[7];
      var endTime = shift[8];
      var guests = shift[1];
      var description = shift[3];
      var location = shift[5];   
      var event = {
          'location': location,
          'description': description,
          'guests':guests +',',
          'sendInvites': 'True',
      }

      eventCal.createEvent(summary, startTime, endTime, event)
  }


}

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

1 Ответ

1 голос
/ 07 ноября 2019

Вы создаете события календаря на основе ответов формы из формы Google. Когда ваш код выполняется, он создает события для всех ответов и не ограничивается самым последним ответом.

Действия для решения этой проблемы двоякие:

  1. вызывает функциюс помощью устанавливаемого триггера `onFormSubmit.
  2. используйте Объекты событий для захвата значений ответов формы и обновления календаря на основе этих значений.

Примечание:Ваша функция теперь называется CreateEvent(e). Атрибут e автоматически предоставит вам доступ к объектам событий.

Следующий код не проверен, но он указывает подход, который необходимо использовать.

`


function CreateEvent(e) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  // Logger.log(JSON.stringify(e)); // DEBUG

  // identify Calendar
  var eventCal = CalendarApp.getCalendarById('<insert id >');

  // get the response data
  var summary = e.values[2];
  var startTime = e.values[7];
  var endTime = e.values[8];
  var guests = e.values[1];
  var description = e.values[3];
  var location = e.values[5];   
  var event = {
    'location': location,
    'description': description,
    'guests':guests +',',
    'sendInvites': 'True',
  }

  // create the event.
  eventCal.createEvent(summary, startTime, endTime, event)


}

onFormSubmit

Важно, чтобы вы активировали свою функцию с помощью устанавливаемого триггера onFormSubmit. Обратитесь к документации для Управление триггерами вручную для пошагового объяснения с практическими рекомендациями.

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

Обратите внимание, что имя функции (CreateEvent) НЕ указывает на то, что вы используете объекты событий - это нормально - триггер просто выбирает основное имя. НО крайне важно, чтобы ваша функция на самом деле называлась CreateEvent(e), чтобы она могла получить доступ к объектам событий.


enter image description here

...