/ / Google Apps Script - Exportieren von Ereignissen aus Google Sheets in Google Kalender - Wie kann ich verhindern, dass meine Tabellenformeln entfernt werden? - Excel, Google-Apps-Skript

Google Apps Script - Exportieren von Ereignissen aus Google Sheets in Google Kalender - Wie kann ich verhindern, dass meine Tabellenformeln entfernt werden? - Excel, Google-Apps-Skript

Ich habe versucht, einen Code zu erstellen, der Informationen aus einer Google-Tabelle und aus Google Kalender-Ereignissen entnimmt. Ich bin neu in diesem Bereich.

Ich habe diesen Beitrag zum Erstellen eines Codes verwendet: Erstellen Sie Google Kalender-Ereignisse aus einer Tabelle, aber vermeiden Sie Duplikate

Ich habe dann herausgefunden, dass das Zeitlimit aufgrund der Anzahl der Zeilen in der Tabelle abgelaufen ist und ich keine eventIDs erstellt habe, um die Duplikate zu vermeiden. Ich habe hier eine Antwort, um das zu klären! Google Script zum Erstellen von Google Kalender-Ereignissen aus einer Google-Tabelle - "Maximale Ausführungszeit überschritten"

Und jetzt ist mir klar geworden, dass es sich um das Überschreiben der Formeln handelt, die ich in der Tabelle habe und die wie folgt in jede Zeile automatisch vervollständigt werden:

Row 12 - =if(E4="","",E4+1) // Row 13 - =if(C4="","",C4+1) // Row 18 - =if(B4="","","WHC - "&B4) // Row 19 - =if(B4="","","Docs - "&B4)

Hat jemand eine Idee, wie ich damit aufhören kann?

/**
* 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 WHCs",
functionName : "exportWHCs"
},
{
name : "Export Docs",
functionName : "exportDocs"
}];
sheet.addMenu("Calendar Actions", entries);
};

/**
* Export events from spreadsheet to calendar
*/
function exportWHCs() {
// check if the script runs for the first time or not,
// if so, create the trigger and PropertiesService.getScriptProperties() the script will use
// a start index and a total counter for processed items
// else continue the task
if(PropertiesService.getScriptProperties().getKeys().length==0){
PropertiesService.getScriptProperties().setProperties({"itemsprocessed":0});
ScriptApp.newTrigger("exportWHCs").timeBased().everyMinutes(5).create();
}
// initialize all variables when we start a new task, "notFinished" is the main loop condition
var itemsProcessed = Number(PropertiesService.getScriptProperties().getProperty("itemsprocessed"));
var startTime = new Date().getTime();
var sheet = SpreadsheetApp.getActiveSheet();
var headerRows = 4;  // Number of rows of header info (to skip)
var range = sheet.getDataRange();
var data = range.getValues();
var calId = "flightcentre.com.au_pma5g2rd5cft4lird345j7pke8@group.calendar.google.com";
var cal = CalendarApp.getCalendarById(calId);
for (i in data) {
if (i < headerRows) continue; // Skip header row(s)
var row = data[i];
var date = new Date(row[12]);  // First column
var title = row[18];           // Second column
var tstart = new Date(row[15]);
tstart.setDate(date.getDate());
tstart.setMonth(date.getMonth());
tstart.setYear(date.getYear());
var tstop = new Date(row[16]);
tstop.setDate(date.getDate());
tstop.setMonth(date.getMonth());
tstop.setYear(date.getYear());
var id = row[17];              // Sixth column == eventId
// Check if event already exists, update it if it does
try {
var event = cal.getEventSeriesById(id);
}
catch (e) {
// do nothing - we just want to avoid the exception when event doesn"t exist
}
if (!event) {
//cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"));
var newEvent = cal.createEvent(title, tstart, tstop).addEmailReminder(5).getId();
row[17] = newEvent;  // Update the data array with event ID
}
else {
event.setTitle(title);
}
if(new Date().getTime()-startTime > 240000){ // if > 4 minutes
var processed = i+1;// save usefull variable
PropertiesService.getScriptProperties().setProperties({"itemsprocessed":processed});
range.setValues(data);
MailApp.sendEmail(Session.getEffectiveUser().getEmail(),"progress sheet to cal","item processed : "+processed);
return;
}
debugger;
}
// Record all event IDs to spreadsheet
range.setValues(data);
}



/**
* Export events from spreadsheet to calendar
*/
function exportDocs() {
// check if the script runs for the first time or not,
// if so, create the trigger and PropertiesService.getScriptProperties() the script will use
// a start index and a total counter for processed items
// else continue the task
if(PropertiesService.getScriptProperties().getKeys().length==0){
PropertiesService.getScriptProperties().setProperties({"itemsprocessed":0});
ScriptApp.newTrigger("exportDocs").timeBased().everyMinutes(5).create();
}
// initialize all variables when we start a new task, "notFinished" is the main loop condition
var itemsProcessed = Number(PropertiesService.getScriptProperties().getProperty("itemsprocessed"));
var startTime = new Date().getTime();
var sheet = SpreadsheetApp.getActiveSheet();
var headerRows = 4;  // Number of rows of header info (to skip)
var range = sheet.getDataRange();
var data = range.getValues();
var calId = "flightcentre.com.au_pma5g2rd5cft4lird345j7pke8@group.calendar.google.com";
var cal = CalendarApp.getCalendarById(calId);
for (i in data) {
if (i < headerRows) continue; // Skip header row(s)
var row = data[i];
var date = new Date(row[13]);  // First column
var title = row[19];           // Second column
var tstart = new Date(row[15]);
tstart.setDate(date.getDate());
tstart.setMonth(date.getMonth());
tstart.setYear(date.getYear());
var tstop = new Date(row[16]);
tstop.setDate(date.getDate());
tstop.setMonth(date.getMonth());
tstop.setYear(date.getYear());
var id = row[20];              // Sixth column == eventId
// Check if event already exists, update it if it does
try {
var event = cal.getEventSeriesById(id);
}
catch (e) {
// do nothing - we just want to avoid the exception when event doesn"t exist
}
if (!event) {
//cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"));
var newEvent = cal.createEvent(title, tstart, tstop).addEmailReminder(5).getId();
row[20] = newEvent;  // Update the data array with event ID
}
else {
event.setTitle(title);
}
if(new Date().getTime()-startTime > 240000){ // if > 4 minutes
var processed = i+1;// save usefull variable
PropertiesService.getScriptProperties().setProperties({"itemsprocessed":processed});
range.setValues(data);
MailApp.sendEmail(Session.getEffectiveUser().getEmail(),"progress sheet to cal","item processed : "+processed);
return;
}
debugger;
}
// Record all event IDs to spreadsheet
range.setValues(data);
}

Antworten:

0 für die Antwort № 1

Sie müssen Wege finden, um dieses Problem zu lösen.

Erste Möglichkeit: Aktualisieren Sie Ihr Blatt mit Array-Daten nur auf Spalten, die haben keine Formeln, verfahren wie in diesem anderen Beitrag In Ihrem Fall (mit mehreren zu überspringenden Spalten) wird es jedoch schnell schwierig

Zweite Möglichkeit: (Die eine, die ich persönlich wählen würde, weil ich kein "Formel-Fan" bin) besteht darin, das zu tun, was Ihre Formeln im Skript selbst tun, dh die Formeln in Operationen auf Array-Ebene zu übersetzen.

deinem Beispiel folgen =if(E4="","",E4+1) würde sowas werden data[n][4]=data[n][4]==""?"":data[n+1][4]; wenn ich die Logik verstehe (aber ich bin nicht so sicher ...).


BEARBEITEN

Es gibt tatsächlich eine dritte Lösung, die noch einfacher ist (Stellen Sie sich vor, warum ich überhaupt nicht darüber nachgedacht habe ...) Sie können die Bereiche mit Formeln speichern, z. B. wenn Spalte M Formeln enthält, die Sie weiterhin verwenden möchten:

var formulM = sheet.getRange("G1:G").getFormulas();

und dann am Ende der Funktion (nach dem globalen setValues()) schreiben Sie die Formeln um mit:

sheet.getRange("G1:G").setFormulas(formulM);

Um alle vorherigen Formeln wiederherzustellen ... wiederholen Sie dies für jede Spalte, in der Sie die Formeln aufbewahren müssen.