0

In einem dokumentengebundenen Google Appscript in einer unserer Unternehmens-Tabellenkalkulationen habe ich ein Skript erstellt, mit dem Tabellenkalkulationszeilen in Google-Kalendertermine umgewandelt werden. Die Funktion funktioniert gut für mich, aber nicht für meinen Kollegen, obwohl wir beide die Berechtigung zum Bearbeiten des Kalenders und zum Ändern der Freigabeberechtigungen haben, und mein Kollege hat bewiesen, dass er Termine im Kalender von calendar.google.com erstellen kann.Google Apps Script erstellen Kalenderereignis aus Blatt verboten?

Er erhält die folgende Fehlermeldung, wenn er das Skript ausgeführt wird:

{"message":"Forbidden","name":"GoogleJsonResponseException","fileName":"SCHEDULER","lineNumber":204,"stack":"\tat SCHEDULER:204 (createAppointments)\n"}

Linie 204 entspricht dem Befehl:

Calendar.Events.insert(event, CAL, {sendNotifications: true, supportsAttachments:true}); 

Wenn er bearbeiten Rechte an der hat Kalender, warum ist das verboten? Gibt es ein Problem mit dem Google Kalender-Dienst in Google Apps Script? Außerdem habe ich die CAL-Variable in einen Kalender geändert, den ich persönlich erstellt und mit denselben Berechtigungen an ihn verteilt habe. Er kann diesen Kalender gut bearbeiten.

Hier ist die psuedocode für die Funktion

function createAppointments() { 
 
    
 
    var CAL = '[email protected].com'; 
 
    
 
    for(/*each row in spreadsheet*/) 
 
    { 
 
     if(/*needs appointment*/) 
 
     { 
 
     var object = {/*...STUFF...*/}; 
 
     var coworker = '[email protected]'; 
 
     var timeArgs = {start: /*UTC Formatted time*/, end: /*UTC Formatted time*/} 
 
     
 
     if(/*All the data checks out*/{ 
 
      var summary = 'Name of appointment' 
 
      var notes = 'Stuff to put in the body of the calendar appointment'; 
 
      var location = '123 Happy Trail, Monterrey, TX 12345' 
 
      
 
      //BUILD GOOGLE CALENDAR OBJECT 
 
      var event = { 
 
      "summary": summary, 
 
      "description": notes, 
 
      "start": { 
 
       "dateTime": timeArgs.start, 
 
       "timeZone": TZ 
 
      }, 
 
      "end": { 
 
       "dateTime": timeArgs.end, 
 
       "timeZone": TZ 
 
      }, 
 
      "guestsCanInviteOthers": true, 
 
      "reminders": { 
 
       "useDefault": true 
 
      }, 
 
      "location": location 
 
      //,"attendees": [] 
 
      }; 
 
      event.attendees = [{[email protected], displayName: 'coworker name'}]; 
 
      
 
      //CREATE CALENDAR IN GOOGLE CALENDAR OF CONST CAL 
 
      Calendar.Events.insert(event, CAL, {sendNotifications: true, supportsAttachments:true}); 
 
     
 
     } else{/*Tell user to fix data*/} 
 
    } 
 
    }

Vielen Dank!


-Update 2017.12.29:

Ich habe versucht, die App Anpassung nach Jason Allshorn and Crazy Ivan. Vielen Dank für Ihre Hilfe, soweit! Interessanterweise habe ich dieselbe Antwort sowohl mit dem Advanced Calendar Service als auch mit der CalendarApp erhalten.

Der Fehler ist, wie unten dargestellt:

<!DOCTYPE html><html><head><link rel="shortcut icon" href="//ssl.gstatic.com/docs/script/images/favicon.ico"><title>Error</title><style type="text/css">body {background-color: #fff; margin: 0; padding: 0;}.errorMessage {font-family: Arial,sans-serif; font-size: 12pt; font-weight: bold; line-height: 150%; padding-top: 25px;}</style></head><body style="margin:20px"><div><img alt="Google Apps Script" src="//ssl.gstatic.com/docs/script/images/logo.png"></div><div style="text-align:center;font-family:monospace;margin:50px auto 0;max-width:600px">Object does not allow properties to be added or changed.</div></body></html>

Oder danach durch einen HTML-Editor-Analyse:

enter image description here

Was bedeutet das auch? Ich habe den erweiterten Dienst aktiviert, und das Skript kann von jedem Benutzer ausgeführt werden. Irgendwelche Ideen?

Ich habe nach dem Testen bestätigt, dass der Fehler zurückkommt, nachdem versucht wurde, den Kalenderereignis-Befehl calendarApp/Advanced Calendar auszuführen.

Hier ist mein Code, den ich verursachte so weit kommen:

function convertURItoObject(url){ 
 
     url = url.replace(/\+/g,' ') 
 
     url = decodeURIComponent(url) 
 
     var parts = url.split("&"); 
 
     var paramsObj = {}; 
 
     parts.forEach(function(item){ 
 
     var keyAndValue = item.split("="); 
 
     paramsObj[keyAndValue[0]] = keyAndValue[1] 
 
     }) 
 
    return paramsObj; // here's your object 
 
    } 
 

 

 
function doPost(e) { 
 
    var data = e.postData.contents; 
 
    data = convertURItoObject(data); 
 
    
 
    var CAL = data.cal; 
 
    var event = JSON.parse(data.event); 
 
    var key = data.key; 
 
    
 
    var start = new Date(event.start.dateTime); 
 
    
 
    if(ACCEPTEDPROJECTS.indexOf(key) > -1) 
 
    { 
 
    try{ 
 
    var calendar = CalendarApp.getCalendarById(CAL); 
 
    calendar.createEvent(event.summary, new Date(event.start.dateTime), new Date(event.end.dateTime), {description: event.description, location: event.location, guests: event.guests, sendInvites: true});} 
 
    
 
    
 
    /*try {Calendar.Events.insert(event, CAL, {sendNotifications: true, supportsAttachments:true});} Same error when I use this command*/ 
 
    catch(fail){return ContentService.createTextOutput(JSON.stringify(fail));} 
 
    
 
    e.postData.result = 'pass'; 
 
    return ContentService.createTextOutput(JSON.stringify(e)); 
 
    } 
 
    else { 
 
    return ContentService.createTextOutput('Execution not authorized from this source. See CONFIG of target project for details.'); 
 
    } 
 
}

Antwort

1

Ihr Skript Advanced Google Services verwendet, speziell Calendar. Lesen Sie den Abschnitt "Erweiterte Dienste aktivieren"; Jeder muss diese Schritte befolgen, um das Skript zu verwenden.

Alternativ (meiner Meinung nach ist dies eine bessere Lösung), schreiben Sie das Skript so um, dass es den Standarddienst CalendarApp verwendet. Es erlaubt Ihnen auch, create an event und dann können Sie add various reminders zu diesem Ereignis.

1

Eine Lösung von meiner Seite wäre, die Kalenderereignis-Funktion weg von Ihrem Spreadsheet-gebundenen Skript zu einem separaten eigenständigen Apps-Skript zu abstrahieren, das unter Ihrem Namen mit Ihren Berechtigungen läuft.

Dann von Ihrem Blatt gebunden Skript-Aufruf an die Standalone-Skript mit einem PUT-Anfrage enthält die Informationen benötigt, um den Kalender zu aktualisieren. Auf diese Weise kann jeder, der mit Ihrem Blatt-Addon arbeitet, den Kalender ohne Unordnung mit Berechtigungen aktualisieren.

Das Blatt gebunden Skript wie folgt aussehen könnte:

function convertURItoObject(url){ 
     url = url.replace(/\+/g,' ') 
     url = decodeURIComponent(url) 
     var parts = url.split("&"); 
     var paramsObj = {}; 
     parts.forEach(function(item){ 
     var keyAndValue = item.split("="); 
     paramsObj[keyAndValue[0]] = keyAndValue[1] 
     }) 
    return paramsObj; // here's your object 
    } 


function doPost(e) { 
    var CAL = '[email protected].com'; 
    var data = e.postData.contents; 
    data = convertURItoObject(data) 
    var event = data.event; 
    try { 
    Calendar.Events.insert(event, CAL, {sendNotifications: true, supportsAttachments:true}); 
    } 
    catch(e){ 
    Logger.log(e) 
    } 
    return ContentService.createTextOutput(JSON.stringify(e)); 
} 

Bitte beachten Sie, muss das Standalone-Skript für jeden zu setzen:

function updateCalander(){ 
    var data = { 
    'event': EVENT, 
    }; 
    var options = { 
     'method' : 'post', 
     'contentType': 'application/json', 
     'payload' : data 
    }; 

    var secondScriptID = 'STANDALONE_SCRIPT_ID' 
    var response = UrlFetchApp.fetch("https://script.google.com/macros/s/" + secondScriptID + "/exec", options); 
    Logger.log(response) // Expected to see sent data sent back 

Dann so etwas wie dies Ihr Standalone-Skript aussehen würde kann zugreifen, und wenn Sie den Code aktualisieren, vergewissern Sie sich, dass Sie den Code erneut veröffentlichen. Wenn Sie Ihre Aufrufe für das Standalone-Skript nicht erneut veröffentlichen, werden sie nicht mit dem neuesten Code erstellt.

Verwandte Themen