0

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"); 

Antwort

0

Kurze Antwort

Ändern Sie den Namen der Würfe onEdit-Funktion

Erläuterung

Verwenden Sie nicht den Namen reservierter Funktionen, um Funktionen zu benennen, die von installierbaren Triggern aufgerufen werden.

onEdit ist eine reservierte Google Apps Script-Funktion, mit der der Google Apps Script-Engine mitgeteilt wird, dass die Funktion beim Auftreten des Bearbeitungsereignisses ausgeführt werden soll. Es kann keine Dienste aufrufen, für die eine Autorisierung erforderlich ist. Weitere Informationen finden Sie unter Simple Triggers.

+0

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 –

Verwandte Themen