2016-08-07 12 views
0

Ich versuche, ein Blatt zu erstellen, das Ereignisse in mehreren Google-Kalendern von einem einzigen Google-Blatt erstellt. Ich benutze ein Blatt, das von der fantastischen Lösung auf diesem Pfosten Create Google Calendar Events from Spreadsheet but prevent duplicates von Mogsdad geändert wird. Jedoch habe ich meine Arbeit verdreifacht, um in 3 verschiedene Kalender zu gehen, und möchte meinen ersten Versuch beim Programmieren haben. Meine Idee ist, ich möchte einen Schritt weiter gehen und fügen Sie eine Dropdown-Spalte (beschriftet Status) mit entweder (unbestätigt, speichern Sie das Datum, bestätigt), die dann eine gerade in einem oder alle drei Kalender mit dem gleichen Namen wie die Bedingung erstellt Dropdown-Liste.Erstellen von Ereignissen in mehreren Google-Kalendern aus der Kalkulationstabelle

Mein Blatt ist so angeordnet, wie: -

Datum | Titel | Startzeit | Endzeit | Standort | Beschreibung | Auch ID | Status | Bestätigte Details | Bestätigte Startzeit | bestätigte Endzeit |

Wie Sie sehen können, ist meine Idee etwas anders im bestätigten Kalender als die anderen beiden.

Der bestehende Code ich verwende ist

/** 
* Adds a custom menu to the active spreadsheet, containing a single menu item 
* for invoking the exportEvents() function. 
* The onOpen() function, when defined, is automatically invoked whenever the 
* spreadsheet is opened. 
* For more information on using the Spreadsheet API, see 
* https://developers.google.com/apps-script/service_spreadsheet 
*/ 
function onOpen() { 
    var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var entries = [{ 
    name : "Export Events", 
    functionName : "exportEvents" 
    }]; 
    sheet.addMenu("Calendar Actions", entries); 
}; 

/** 
* Export events from spreadsheet to calendar 
*/ 
function exportEvents() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var headerRows = 1; // Number of rows of header info (to skip) 
    var range = sheet.getDataRange(); 
    var data = range.getValues(); 
    var calId = "[email protected]"; 
    var cal = CalendarApp.getCalendarById(calId); 
    for (i=0; i<data.length; i++) { 
    if (i < headerRows) continue; // Skip header row(s) 
    var row = data[i]; 
    var date = new Date(row[0]); // First column 
    var title = row[1];   // Second column 
    var tstart = new Date(row[2]); 
    tstart.setDate(date.getDate()); 
    tstart.setMonth(date.getMonth()); 
    tstart.setYear(date.getYear()); 
    var tstop = new Date(row[3]); 
    tstop.setDate(date.getDate()); 
    tstop.setMonth(date.getMonth()); 
    tstop.setYear(date.getYear()); 
    var loc = row[4]; 
    var desc = row[5]; 
    var id = row[6];    // Sixth column == eventId 
// Check if event already exists, delete it if it does 
try { 
    var event = cal.getEventSeriesById(id); 
    event.deleteEventSeries(); 
    row[6] = ''; // Remove event ID  
} 
catch (e) { 
    // do nothing - we just want to avoid the exception when event doesn't exist 
} 
//cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"), {description:desc,location:loc}); 
var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}).getId(); 
row[6] = newEvent; // Update the data array with event ID 
debugger; 
    } 
    // Record all event IDs to spreadsheet 
    range.setValues(data); 
} 

Also ich merke, ich brauche die neuen Informationen zu definieren, die „bestätigt“ gehen in sowie die 2 zusätzlichen Kalender. Mein Problem ist, dass ich nicht in eine Reihe von if-Schleifen passen kann, um Ereignisse in die 3 Kalender zu leiten. Ich möchte auch, dass die Kalender additiv sind, z. Alle Ereignisse, die in "unbestätigter Kalender" -Ereignisse erscheinen, werden hinzugefügt, um das Datum zu speichern, wenn sie auf diesen Status hochgestuft werden, und erscheinen schließlich in "bestätigt", wenn sie auf diesen Wert gesetzt werden. So erscheint ein bestätigtes Ereignis in allen 3 Kalendern, aber ein unbestätigtes erscheint nur dort.

Ich bin praktisch nagelneu im Programmieren, also sei bitte nett und entschuldige meinen eklatanten Planarismus von anderen (danke Mogsdad) und ich schätze jede Hilfe!

Antwort

0

Willkommen bei der Programmierung! Sobald Sie den Überblick haben, sollten Sie jedes von Ihnen verwendete Google-Produkt skripten. :)

Wenn ich Ihre Frage richtig verstehe, möchten Sie in der Lage sein zu wählen, welcher Kalender ein Ereignis geht, wenn Sie die Funktion exportEvents() ausführen. Dazu gibt es mehrere Möglichkeiten und Sie benötigen keine zusätzlichen Schleifen! Sie können Objekte verwenden und auf sie mit Namen verweisen.

Was würde ich als erstes tun, wo Sie sich gerade definieren cal und calId, ist ein Objekt erstellen, das die drei Kalender wie folgt definiert:

var cal1 = "[email protected]"; 
var cal2 = "string url for second calendar"; 
var cal3 = "string url for third calendar"; 
var calendars = { 
    Unconfirmed: CalendarApp.getCalendarById(cal1), 
    SaveTheDate: CalendarApp.getCalendarById(cal2), 
    Confirmed: CalendarApp.getCalendarById(cal3) 
} 

Das Objekt calendars jetzt die Kalender-Objekte für die drei Kalender enthält, so dass der Schlüssel der Status ist und der Wert das Objekt ist. Dann, wenn Sie die Daten für jede Zeile sind Grabbing, fügen

var cal = row[7]; 

Nun cal die Zeichenfolge enthält, die den Status. Sie können, indem sie eine Änderung Ihrer newEvent Definition großen Einsatz von Verkettungs machen:

var newEvent = calendars[cal].createEvent(title, tstart, tstop, {description:desc,location:loc}).getId(); 

Was geschieht hier ist calendars[cal] bekommt den Kalender Objekt auf den String in der Tabelle entspricht, auf die Sie dann das neue Ereignis hinzuzufügen.Dazu müssen Sie Ihr Blatt ändern - ändern Sie das Etikett in Ihrer Statusspalte von "Save the Date" in "SaveTheDate", damit es mit dem Variablennamen übereinstimmt. Das sollte es tun!

EDIT

Um das Ereignis zu mehreren Kalendern hinzufügen, ich if Anweisungen verwenden würde, aber Sie keine Schleife benötigen. Etwas wie das Folgende würde funktionieren:

calendars['Unconfirmed'].createEvent(title... // Add to unconfirmed no matter what 
if (cal != 'Unconfirmed'){ 
    calendars['SaveTheDate'].createEvent(title... // Add to SaveTheDate only if not Unconfirmed 
} 
if (cal == 'Confirmed'){ 
    calendars['Confirmed'].createEvent(title... // Only add to Confirmed if Confirmed 
} 
+0

Hallo Tiffany, Vielen Dank das ist sehr hilfreich und funktioniert gut. Ich habe eine Follow-up-Frage, die ich gerne stellen würde. Ich möchte, dass die "bestätigten" Ereignisse in alle 3 Kalender gehen, das "SaveTheDate" in die "SaveTheDate" und "Unconfirmed" Kalender und dann "Unconfirmed" um nur in den "Unconfirmed" Kalender zu gehen. Weißt du, wie ich sie additiv machen kann, anstatt nur den einen Kalender auszuwählen, um auch zu gehen? In meiner ursprünglichen Idee würde ich eine "wenn" if Schleife haben, um sie dann zu jedem Kalender zu senden, aber Ihre Methode lässt mich glauben, dass es einen einfachen Weg geben könnte! Vielen Dank im Voraus –

+0

Siehe meine Antwort - ich habe etwas hinzugefügt, das helfen sollte. Bitte akzeptiere meine Antwort, wenn du der Meinung bist, dass es nützlich ist! –

+0

Ich habe vergessen zu sagen, bevor Ihre vorherige Antwort die scrips Fähigkeit verloren hat, alte Ereignisse zu löschen (um Duplikate zu vermeiden), bis die deleat Ereigniszeile auch aktualisiert wurde. 'try { var event = Kalender ['Unbestätigt']. getEventSeriesById (id);' alles funktioniert jetzt, außer für die 2 neu eingeführten Kalender, löschen Sie keine aktualisierten Ereignisse. Ich habe versucht, 2 zusätzliche Versuchs- und Fangfunktionen mit 'try { var event = Kalender ['Bestätigt'] hinzuzufügen. GetEventSeriesById (id); event.deleteEventSeries(); } catch (e) { } 'aber das scheint nicht zu funktionieren (in der Tat tut nichts eine Idee warum? –

Verwandte Themen