Игнорировать пустые ячейки и пропускать повторяющиеся записи в Google Sheets / Calendar Sync - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь написать скрипт для Google Sheets для синхронизации c с Календарем Google. Мой текущий контрольно-пропускной пункт пытается заставить это прочитать все записи в столбце, игнорируя пустые ячейки и не делая дублирующие записи, если я запускаю это несколько раз. Когда для getRange задано значение, которое охватывает пустую ячейку, оно выдаст ошибку

Исключение: параметры (String, String, String) не соответствуют сигнатуре метода для CalendarApp.Calendar. createEvent.

Хотя он все еще создает записи, я уверен, что тот, кто будет обеспокоен, когда увидит красную ошибку, сообщающую, что что-то пошло не так.

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

Вот текущий скрипт.

        function onOpen() {
     var ui = SpreadsheetApp.getUi();
     var menu = ui.createMenu('Sync to Calendar');
     var item = menu.addItem('Commit', 'syncCalendar');
     item.addToUi();
    }

    function syncCalendar() {

      var spreadsheet = SpreadsheetApp.getActive();

      var calendarId = "*******";

      var eventCal = CalendarApp.getCalendarById(calendarId);

      var signups = spreadsheet.getRange("D3:F10").getValues();

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

        var slot = signups[x];

        var startTime = slot[0];
        var endTime = slot[1];
        var name = slot[2];

        eventCal.createEvent(name, startTime, endTime);
      }
    }

1 Ответ

0 голосов
/ 13 февраля 2020
  • Вы хотите удалить ошибку, как показано в вашем вопросе.
    • В этом случае пустые значения включаются в signups. Вы хотите игнорировать эти пустые значения.
  • Вы не хотите создавать дублированные события.

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

Точки модификации:

  • Чтобы игнорировать пустые значения, в этом случае используется if (name && startTime && endTime) {}.
  • Чтобы избежать создания дублированных событий, используется if (!eventCal.getEvents(startTime, endTime)) {}.

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

Модифицированный скрипт :

С:
for (x=0; x<signups.length; x++) {

  var slot = signups[x];

  var startTime = slot[0];
  var endTime = slot[1];
  var name = slot[2];

  eventCal.createEvent(name, startTime, endTime);
}
Кому:
for (x=0; x<signups.length; x++) {
  var slot = signups[x];
  var startTime = slot[0];
  var endTime = slot[1];
  var name = slot[2];
  if (name && startTime && endTime) {  // Added
    if (eventCal.getEvents(startTime, endTime).length == 0) {  // Added
      eventCal.createEvent(name, startTime, endTime);
    }
  }
}
  • В этом случае все 3 значения name, startTime и endTime существуют, оператор if становится true. Если вы хотите изменить это условие, измените его в соответствии с вашей реальной ситуацией.
  • В приведенном выше сценарии, даже если заголовок события отличается, в то время как startTime и endTime совпадают, новое событие не создан. Если вы хотите создать новое событие, когда заголовок события отличается, пожалуйста, измените if (eventCal.getEvents(startTime, endTime).length == 0) { следующим образом.

    if (eventCal.getEvents(startTime, endTime, {search: name}).length == 0) {
    

Ссылка:

Если я неправильно понял ваш вопрос, и это не то направление, в котором вы хотите, я приношу свои извинения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...