Kinda new to Google Apps Script. I'm trying to create Google Calendar events from GoogleSheet. It won't be revealing that I'm using someone's answers where some answers are here from stackoverflow. Unfortunately, I have not found a complete answer to my problem. Or if there was I couldn't recreate it :)
That's the Google Sheet that I'm using (trying to make a shipping calendar where someone can track deliveries). Columns marked as 0 are not used to make calendar events, only these marked as 1. For example what should be in Calendar Event: Title: L-H-19/22/Description: Driver 1 Mobile: 1234567890/Date:2022-05-16
Note: Date probably will be changed to start/end date with hours. (2022-05-16 06:00 - 2022-5-16 07:00). Also, I mentioned "Description" which I'm not using but I'll give it a go, while I change ".createAllDayEvent" to ".createEvent", that's why also there is commented "DATA_2".
For now, it creates an event but I cannot figure out how to update it without making duplicates.. Tried to use .deleteEventSeries() and update it, also tried to use trigger onEdit() but still without luck.
Here is code which I use to add events to calendar:
function initMenu() {
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('SPEDYCJA')
menu.addItem('DODAJ DO KALENDARZA','DodanieSpedycjiDoKalendarza')
menu.addItem('AKTUALIZUJ KALENDARZ','AktualizacjaWydarzenia')
menu.addToUi();
}
function onOpen() {
initMenu();
}
function DodanieSpedycjiDoKalendarza() {
var ui = SpreadsheetApp.getUi();
var WcisnietyPrzycisk = ui.alert("Czy na pewno chcesz uruchomić skrypt??",ui.ButtonSet.YES_NO);
if (WcisnietyPrzycisk == ui.Button.YES) {
let AktywnyArkusz = SpreadsheetApp.getActiveSheet();
let KalendarzSpedycja = CalendarApp.getCalendarById("[email protected]");
let TabelaDanych = AktywnyArkusz.getRange(12,8,8,9).getValues();
for (let x=0; x<TabelaDanych.length; x ) {
const ZMIANA = TabelaDanych[x];
const TYTUŁ = ZMIANA[0];
const DATA_1 = ZMIANA[7];
//const DATA_2 = ZMIANA[14];
const ID_Wydarzenia = ZMIANA[8];
if (ID_Wydarzenia == "") {
const NoweWydarzenie = KalendarzSpedycja.createAllDayEvent(TYTUŁ,DATA_1);
const ID_NoweWydarzenie = NoweWydarzenie.getId();
AktywnyArkusz.getRange(8 x,8).setValue(ID_NoweWydarzenie);
}
try {
var event = KalendarzSpedycja.getEventSeriesById(ID_Wydarzenia);
event.deleteEventSeries();
//entry[9] = '';
} catch(e) {
//nie rób nic
}
var newEvent = KalendarzSpedycja.createAllDayEvent(TYTUŁ,DATA_1);
// entry[9] = newEvent;
debugger;
}
ui.alert("Dodano spedycje do kalendarza!")
} else if (WcisnietyPrzycisk == ui.Button.NO) {
ui.alert("Nie uruchomiłeś skryptu.");
}
}
Also, sample code where I tried to use trigger onEdit() while then in the main function I did not used "try { .deleteEventSeries() }", there was only loop for but still failed..
function AktualizacjaWydarzenia(e) {
var ZaktualizowaneWiersze = e.range.getRange();
var ZaktualizowaneDane = e.source.getActiveSheet().getRange(ZaktualizowaneWiersze, 8, 8, 9).getValues()[4];
var ID_ZaktualizowaneWydarzenie = ZaktualizowaneDane[9]
try {
var Wydarzenie = CalendarApp.getEventById(ID_ZaktualizowaneWydarzenie);
ID_ZaktualizowaneWydarzenie.setTitle(ZaktualizowaneDane[1]);
ID_ZaktualizowaneWydarzenie.setDate(ZaktualizowaneDane[8]);
} catch(err) {
console.log("Wystąpił błąd podczas aktualizowania wydarzeń do kalendarza. Konkretne wydarzenie może jeszcze nie istnieć.");
}
}
I will be very grateful where someone will paste answer with code and point me/critique in existing one what I did wrong.
Thank you, have a nice day.
CodePudding user response:
To prevent duplicates,
you need to save in one column the event id when you create that event. Then, if you want to update, you have to take account of this id.
reference
try
function AktualizacjaWydarzenia(ID_Wydarzenia,TYTUŁ,DATA_1,DATA_2) {
var Wydarzenie = CalendarApp.getEventById(ID_ZaktualizowaneWydarzenie);
Wydarzenie.getEventById(ID_Wydarzenia).setTitle(TYTUŁ)
Wydarzenie.getEventById(ID_Wydarzenia).setTime(DATA_1,DATA_2)
}
CodePudding user response:
At first, thank You very much for Your answer. I'm trying the first option that You mentioned, changed .createAllDayEvent to .createEvent and I have small problem with "Invalid argument: iCalId"
Invalid Argument picture - with visible line 61
function initMenu() {
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('SPEDYCJA')
menu.addItem('DODAJ DO KALENDARZA','DodanieSpedycjiDoKalendarza')
menu.addItem('AKTUALIZUJ KALENDARZ','AktualizacjaWydarzenia')
menu.addToUi();
}
function onOpen() {
initMenu();
}
let AktywnyArkusz = SpreadsheetApp.getActiveSheet();
let KalendarzSpedycja = CalendarApp.getCalendarById("[email protected]");
function DodanieSpedycjiDoKalendarza() {
var ui = SpreadsheetApp.getUi();
var WcisnietyPrzycisk = ui.alert("Czy na pewno chcesz uruchomić skrypt??",ui.ButtonSet.YES_NO);
if (WcisnietyPrzycisk == ui.Button.YES) {
//let AktywnyArkusz = SpreadsheetApp.getActiveSheet();
//let KalendarzSpedycja = CalendarApp.getCalendarById("[email protected]");
let TabelaDanych = AktywnyArkusz.getRange(12,8,8,9).getValues();
for (let x=0; x<TabelaDanych.length; x ) {
const ZMIANA = TabelaDanych[x];
const TYTUŁ = ZMIANA[0];
const DATA_1 = ZMIANA[7];
const DATA_2 = ZMIANA[8];
const ID_Wydarzenia = ZMIANA[9];
if (ID_Wydarzenia == "") {
const NoweWydarzenie = KalendarzSpedycja.createEvent(TYTUŁ,DATA_1,DATA_2);
const ID_NoweWydarzenie = NoweWydarzenie.getId();
AktywnyArkusz.getRange(8 x,8).setValue(ID_NoweWydarzenie);
}
try {
var event = KalendarzSpedycja.getEventSeriesById(ID_Wydarzenia);
event.deleteEventSeries();
//entry[9] = '';
} catch(e) {
//nie rób nic
}
var newEvent = KalendarzSpedycja.createEvent(TYTUŁ,DATA_1,DATA_2);
// entry[9] = newEvent;
debugger;
}
ui.alert("Dodano spedycje do kalendarza!")
} else if (WcisnietyPrzycisk == ui.Button.NO) {
ui.alert("Nie uruchomiłeś skryptu.");
}
}
function AktualizacjaWydarzenia(ID_Wydarzenia,TYTUŁ,DATA_1,DATA_2) {
KalendarzSpedycja.getEventById(ID_Wydarzenia).setTitle(TYTUŁ)
KalendarzSpedycja.getEventById(ID_Wydarzenia).setTime(DATA_1,DATA_2)
}
What should I do? Thank You