Ich arbeite an einem Skript, das an eine Google Tabellenkalkulation angehängt ist, die mir hilft, einen Schichtplan für Mitarbeiter zu erstellen, einen Google Kalender zu erstellen und den Kalender zu aktualisieren, wenn Leute tauschen Verschiebungen. Ich habe einen onEdit() installierbaren Trigger an die Tabelle angehängt, der prüft, ob ein Benutzer eine Zelle in einem bestimmten Bereich geändert hat (um Schichten zu tauschen), sucht dann die Zellen im Kalender in der Tabelle, wechselt sie und ruft und aktualisiert Google Kalender.Google Tabellen installierbar onEdit() Auslöser nicht berechtigt, Kalenderereignis hinzuzufügen
Es läuft perfekt, wenn es aus dem Skript-Editor ausgeführt wird. Aber wenn sie von dem Trigger in der Tabelle ausgeführt wird, bekomme ich diesen Fehler:
"Execution failed: You do not have permission to call getOwnedCalendarsByName (line 204, file "Code") [1.021 seconds total runtime]"
in dem Google Apps Berechtigungen, sagt er dies für das Skript: „Google Calendar Kalender verwalten“, so dass es genehmigt werden soll.
Hier ist die Funktion durch die installierbare Trigger genannt onEdit
function onEdit(e) {
var sheets = SpreadsheetApp.getActive();
var dutySwitchSheet = sheets.getSheetByName('Duty Switches');
if(!e){
var e = {};
e.range = dutySwitchSheet.getRange(30, 9);
}
Logger.log(e.range.getValue());
var changedRow = e.range.getRow();
var changedCol = e.range.getColumn();
var RAInitials = sheets.getRangeByName("dutySwitchRAInitials");
var rangeTop = RAInitials.getRow();
var rangeBottom = RAInitials.getLastRow();
var rangeLeft = RAInitials.getColumn();
var rangeRight = RAInitials.getLastColumn();
Logger.log("changedRow: %s, changedCol: %s, rangeTop: %s, rangeBottom: %s, rangeLeft: %s, rangeRight: %s", changedRow, changedCol, rangeTop, rangeBottom, rangeLeft, rangeRight);
if(changedRow >= rangeTop && changedRow <= rangeBottom && changedCol >= rangeLeft && changedCol <= rangeRight && e.range.getSheet().getName().toUpperCase() === dutySwitchSheet.getName().toUpperCase()){
Logger.log("event sheet name: %s, Duty Switch Sheet Name: %S", e.range.getSheet().getName().toUpperCase(), dutySwitchSheet.getName().toUpperCase());
var relRow = changedRow - rangeTop + 1;
Logger.log("Checking if both initials are present");
if(RAInitials.getCell(relRow, 1).getValue() && RAInitials.getCell(relRow,2).getValue()){
var ui = SpreadsheetApp.getUi()
ui.showModalDialog(HtmlService.createHtmlOutput(""), "Checking Your input, please wait..");
Logger.log("updating");
var RA1Range = sheets.getRangeByName("dutySwitchRA1");
var RA2Range = sheets.getRangeByName("dutySwitchRA2");
var calendarRange = sheets.getRangeByName("dutyDays");
var startDate = new Date(sheets.getRangeByName("startDate").getValue());
var startDay = startDate.getDay();
var RA1 = {name: RA1Range.getCell(relRow, 1).getValue(), shiftNum: RA1Range.getCell(relRow, 2).getValue(), date: new Date(RA1Range.getCell(relRow, 3).getValue()) };
if(RA1.shiftNum != "N/A"){
RA1.day = Math.floor((RA1.date.getTime() - startDate.getTime())/(24*60*60*1000)) + startDay;
RA1.SwappedCell = calendarRange.getCell(Math.floor(RA1.day/7) * 3 + Number(RA1.shiftNum) + 1, (RA1.day % 7) + 1);
RA1.cellValue = String(RA1.SwappedCell.getValue());
}
var RA2 = {name: RA2Range.getCell(relRow, 1).getValue(), shiftNum: RA2Range.getCell(relRow, 2).getValue(), date: new Date(RA2Range.getCell(relRow, 3).getValue()) };
if(RA2.shiftNum != "N/A"){
RA2.day = Math.floor((RA2.date.getTime() - startDate.getTime())/(24*60*60*1000)) + startDay;
RA2.SwappedCell = calendarRange.getCell(Math.floor(RA2.day/7) * 3 + Number(RA2.shiftNum) + 1, (RA2.day % 7) + 1);
RA2.cellValue = String(RA2.SwappedCell.getValue());
}
Logger.log("RA1 name: %s, date: %s, cellValue: %s; RA2 name: %s, date: %s, cellValue: %s" , RA1.name, RA1.date, RA1.cellValue, RA2.name, RA2.date, RA2.cellValue);
Logger.log("RA1 name matches: %s, RA2 name matches: %s", RA1.cellValue.indexOf(RA1.name) != -1, RA2.cellValue.indexOf(RA2.name) != -1);
if(RA1.cellValue.indexOf(RA1.name) != -1 || RA1.shiftNum == "N/A" && RA2.cellValue.indexOf(RA2.name) != -1 || RA2.shiftNum == "N/A"){
Logger.log("Swapping Cells");
if(RA1.shiftNum != "N/A"){
RA1.SwappedCell.setValue(String(RA1.SwappedCell.getValue()).replace(RA1.name, RA2.name));
}
if(RA2.shiftNum != "N/A"){
RA2.SwappedCell.setValue(String(RA2.SwappedCell.getValue()).replace(RA2.name, RA1.name));
}
Logger.log("Syncing Google Calendar");
syncGoogleCalendar();
ui.showModalDialog(HtmlService.createHtmlOutput(""), "The Google Calendar has been updated! :)");
Logger.log("Done Updating!");
}
else {
Logger.log("Did Not Swap Cells");
ui.showModalDialog(HtmlService.createHtmlOutput(""), "The info input does not match the spreadsheet. Couldn't update :(");
}
}
}
}
Und hier ist die updateGoogleCalendar() Funktion, bis er den Fehler
function syncGoogleCalendar(){
var dutyCalendars = CalendarApp.getOwnedCalendarsByName("RA Duty Calendar");
Vielen Dank! Ich habe es in OnDutySwitch() geändert. Ich hatte das schon einmal versucht, aber es hat nicht funktioniert. Ich habe damit herumgespielt und gelernt, dass ich es nicht schaffen kann, indem ich den aktuellen installierbaren Auslöser ändere. Stattdessen musste ich das alte löschen und das neue erstellen –