Изменить календарь Google на основе данных электронной таблицы Google (не допускать дублирования) - PullRequest
2 голосов
/ 30 января 2020

У меня есть следующая таблица, и я хочу отправить людям напоминание, а также добавить события в календарь. Я написал следующий код, который работает, но имеет проблемы. Я активировал триггер, который при каждом редактировании запускает код. Таким образом, чтобы избежать дублирования электронных писем или дублирования «добавления в календарь», я добавил два столбца eventid и calendarid, которые заменяют ячейку на напоминание, если напоминание отправлено, или обновление календаря, если событие добавлено в календарь. Хотя это решает проблему дублирования, но вызывает другие проблемы:

  1. , если я отредактирую любую информацию в электронной таблице, он не будет отправлять напоминание или обновлять календарь, поскольку это уже было сделано. даже если я удаляю текст календаря из calendarid, он добавляет новое событие вместо изменения существующего.

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

I буду признателен, если кто-нибудь может помочь мне улучшить мой код. Это будет много значить для меня. Спасибо

enter image description here

 
function createCalendarEvent() {
var sheet  = SpreadsheetApp.getActiveSheet();
  
   // figure out what the last row is
  var lastRow1 = sheet.getLastRow();
 
  // the rows are indexed starting at 1, and the first row
  // is the headers, so start with row 5
  var startRow1 = 5;
  
 
  // grab column 6 (the 'days left' column) 
  var range = sheet.getRange(5,6,lastRow1-startRow1+1,1 );
  var numRows = range.getNumRows();
  var days_left_values = range.getValues();
   
  
    range = sheet.getRange(5, 1, lastRow1-startRow1+1, 1);
  var start_info_values = range.getValues();
  
     range = sheet.getRange(5, 2, lastRow1-startRow1+1, 1);
  var end_info_values = range.getValues();
  
  range = sheet.getRange(5, 3, lastRow1-startRow1+1, 1);
  var reminder_info_values = range.getValues();
  
     range = sheet.getRange(5, 4, lastRow1-startRow1+1, 1);
  var names_info_values = range.getValues();
  
  range = sheet.getRange(5, 5, lastRow1-startRow1+1, 1);
    var emails_info_values = range.getValues();
  
   range = sheet.getRange(5, 7, lastRow1-startRow1+1, 1);
    var eventID_info_values = range.getValues();
  
    range = sheet.getRange(5, 8, lastRow1-startRow1+1, 1);
    var CalID_info_values = range.getValues();

  
  var warning_count = 0;
  var msg = "";
  var complete="ReminderSent";
  var CalendarUpdated="CalendarUpdated";
  
   
      var calendarId = sheet.getRange("H2").getValue();
     var eventCal = CalendarApp.getCalendarById(calendarId);
   range = sheet.getRange(5, 1, lastRow1-startRow1+1, 8);
    var data = range.getValues();
  
    for (var i = 0; i < data.length; ++i) {
      
       var start = start_info_values [i][0];
       var end = end_info_values [i][0];
       var reminder_name = reminder_info_values[i][0];
       var names = names_info_values [i][0];

    var CalID = CalID_info_values [i][0]; //event marked CalendarUpdated
   
    if (CalID != CalendarUpdated) {
      var currentCell = sheet .getRange(startRow1 + i, 8);
      eventCal.createEvent(eminder_name, start, end, {description: names} );
    
      currentCell.setValue(CalendarUpdated);
    
  }
  }
   
  // Loop over the days left values
  for (var i = 0; i <= numRows - 1; i++) {
    var days_left = days_left_values[i][0];
    if(days_left <=2) {
     
      //var reminder_name = reminder_info_values[i][0];
       
      msg = msg + "Reminder: "+reminder_name+" is due in "+days_left+" days.\n";
      warning_count++;
    }
    var emails= emails_info_values [i][0];
      if(warning_count) {
        var eventID= eventID_info_values[i][0];
        if(eventID!=complete){
           var currentCell = sheet .getRange(startRow1 + i, 7);
    MailApp.sendEmail(emails,"Reminder", msg);
          currentCell.setValue(complete);
        }
  }
    
  }
}
  

  

1 Ответ

1 голос
/ 30 января 2020

Если я отредактирую какую-либо информацию в электронной таблице, он не отправит напоминание или не обновит календарь, поскольку это уже было сделано. даже если я удаляю текст календаря, отправленный из calendarid, он добавляет новое событие вместо изменения существующего.

Существует две вещи, которые вы можете сделать, либо

  • удалить onEdit значения ReminderSent и CalendarUpdated для редактируемой строки, так что код запускается снова
  • или (что намного лучше) избавиться от столбцов eventid и calendarid в целом и просто запустите ваш код только для отредактированной строки

В обоих случаях вам нужно работать с объектами события . Это позволит вам запускать код только в отредактированной строке и, таким образом, избежать дублирования и циклического повторения всех строк.

Пример проверки того, было ли создано новое событие или уже существующее обновлено:

function createCalendarEvent(event) {
 var calendarId = sheet.getRange("H2").getValue();
 var eventCal = CalendarApp.getCalendarById(calendarId);
 var values = event.values;
 var start = values[0][0];
 var end = values[0][1];
 var title = values[0][2];
 var exists = eventCal.getEvents(start, end, {search: title});
 if (exists.length == 0){
   eventCal.createEvent(title, start, end);
  } else {
   var event = eventCal.getEventById(exists[0].getId());
   var range = e.range;
   var column = range.getColumn();
   switch(column){
     case 1:
     case 2:
       event.setTime(start, end);
      break;
     case 3:
       event.setTitle(title);
      break;
     //...
    }
  //...
  }
/ ...  
}

Если я заполню первую ячейку, оставлю вторую ячейку пустой и заполню третью ячейку, электронное письмо, введенное в третью ячейку, не получит напоминание.

Если вы попытаетесь отправить электронное письмо на пустую строку, это может привести к ошибке вашего кода и остановке. Чтобы избежать этого, убедитесь, что значение электронной почты не пусто перед отправкой:

if(emails != "" && emails != " "){
  MailApp.sendEmail(emails,"Reminder", msg);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...