2

J'essaie de créer un script Google Apps qui permet de conserver un Google Agenda et une «feuille de calcul principale» sur Drive synchronized - est-ce possible? J'ai trouvé ces deux postes:Comment synchroniser Google Calendar et Spreadsheet avec le script

Je suis tout à fait sûr que cela pourrait être fait en utilisant beaucoup de si les déclarations et la logique, mais peut-être il y a une plus simple façon?

Je me suis contenté de fournir le script simple suivant. Tout ce qui était vraiment nécessaire était d'ajouter des événements basés sur deux colonnes, ce qui aurait pris trop de temps à se développer.

function onOpen() { 
    //spawns a menu with a button that triggers AddToCal 
    var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var entries = [{ 
    name : "Add event to calendar", 
    functionName : "AddToCal" 
    }]; 
    sheet.addMenu("Data To Calendar Plugin", entries); 
}; 

function AddToCal(){ 

    //get the current row 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var cell = ss.getActiveCell(); 
    var R = cell.getRow(); 

    //grab values for current row to pass to calendar event 
    var date_of_event = ss.getRange('G'+R).getValue(); 
    var date = new Date(date_of_event); 
    var event_title = ss.getRange('A'+R).getValue(); 
    //access the calendar 
    var cal = CalendarApp.getCalendarById('[IDREMOVED]'); 
    cal.createAllDayEvent(event_title,date); 

    ss.toast("Event added to " + cal.getName()); 
    } 

Répondre

3

Oui, c'est possible pour écrire un script de synchronisation d'événement bidirectionnel, mais ce ne sera pas simple. Ces deux articles que vous avez référencés ont des parties qui pourraient être réutilisées, mais elles sont assez élémentaires comparées aux défis auxquels vous serez confrontés avec la synchronisation réelle. Vous voudrez peut-être lire Using Google Apps Script for a event booking system qui crée des entrées de calendrier basées sur une feuille de calcul (mais ne fait pas de synchronisation en cours). J'ai fait quelques debugging of that script dans le passé.

La synchronisation devrait soutenir:

  • Création d'événements dans ces deux endroits
  • Modification des détails de l'événement dans ces deux endroits (bien que vous pourriez choisir de considérer qu'un sous-ensemble des détails de l'événement pour la simplification)
  • Suppression d'événements dans l'un ou l'autre des lieux
  • Récurrence, par exemple CalendarEvent.getEventSeries() manutention (ou choisir d'éviter)

Ceci est pseudo-code que vous pourriez commencer par:

Open Calendar, Read Calendar events into calArray (will all attributes you care for) 
Open Spreadsheet, Read Spreadsheet events into sheetArray 

For each event in calArray: 
    Search for calEvent in sheetArray. 
    If found, compare lastUpdated values. 
    If equal, do nothing 
    Otherwise copy most recently updated to least recently updated 
    Continue with next event 
    If not found then copy calEvent to new sheetEvent, including lastUpdated value. 
    Continue with next event 

For each event in the sheetArray (...that hasn't been handled yet) 
    Similar logic above. 

Write updated sheetArray to spreadsheet. 
Write updated calEvents to calendar API (see note 1 below) 

Notes:

  1. Toutes les mises à jour de calEvents pourrait être à un tableau et écrit immédiatement dans l'API du calendrier, comme alternative à une mise à jour groupée. Cela éliminerait le besoin de suivre les modifications localement, bien que ce serait une bonne idée de toucher la valeur lastUpdated.Vous devrez utiliser CalendarEvent.getLastUpdated() lors de la lecture de calEvents, et stocker une valeur similaire dans votre feuille de calcul (liée à un déclencheur onEdit) pour faciliter les comparaisons.

  2. Il serait simplifier les comparaisons d'enregistrer CalendarEvent.getId() contre les événements dans la feuille de calcul. Vous pouvez également utiliser CalendarEvent.setTag(key,value) pour enregistrer des métadonnées personnalisées dans le calendrier, par exemple pour indiquer des événements qui ont été générés ou qui ont été synchronisés avec votre feuille de calcul. (Ces balises ne sont pas accessibles via l'interface utilisateur de GCal, elles ne seraient donc accessibles que via un script.)

  3. Vous devriez penser à la plage de dates ou au nombre d'événements que vous voulez traiter, et limiter la portée du script . Si vous ne le faites pas, vous êtes sûr de rencontrer des limites de temps d'exécution en fonctionnement réel.

  4. Quelques calendrier caractéristiques de l'événement ne se prêtent pas à l'expression facile dans une feuille de calcul, par exemple:

    • Liste des invités
    • liste Rappel
2

Non, il n'y en a pas. Et bien que de nombreux problèmes concernant Apps Script Calendar Service aient été résolus (fuseaux horaires, événements d'une journée, requêtes, etc.), la tâche reste relativement complexe.

Je sais que Serge, the top contributor here in SO sur # tag google-apps-script, a développé assez some scripts impliquant le service de calendrier.

Mais je ne sais pas de toute façon qui a fait une mise à jour bidirectionnelle entre un calendrier et une feuille de calcul. Cela devrait être difficile. Si jamais vous le faites, s'il vous plaît soyez aimable à partager :)

+0

Je ne sais pas si je vais finir par écrire ce script, je suis toujours essayer de comprendre le cas d'utilisation et je pourrais seulement avoir besoin de développer quelque chose de beaucoup plus simple. Tout ce qui est écrit sera partagé ici – digitalsteez

4

Comme mentionné (merci Henrique) dans l'autre post que j'ai passé un certain temps - c'était en fait ce qui m'a amené à GAS à l'origine - sur l'échange de données entre les feuilles de calcul et les calendriers principalement parce que peo Je travaillais avec l'organisation de leur emploi du temps (pour un lycée) dans des tableurs et je devais m'occuper de la transition vers Google Calendars.

Après un certain temps, il est apparu que l'interface de calendrier en ligne est beaucoup plus efficace pour créer des événements afin qu'ils n'utilisent plus la feuille dans les scripts de calendrier !! D'autre part, les options d'impression et de présentation dans GCal sont très limitées, donc l'autre sens est toujours très utile et nous l'utilisons tout le temps! Je sais que cela va sembler hors sujet en ce qui concerne la question originale et peut-être trop anecdotique mais je voulais juste faire remarquer que vous devriez réfléchir sérieusement à ce dont vous avez vraiment besoin avant de réinventer la roue ... Comme Mogsdad l'a mentionné, certains paramètres d'événements ne sont pas faciles à décrire dans la logique des feuilles de calcul et finalement cela pourrait devenir beaucoup plus compliqué à utiliser que l'outil d'origine.

Le seul outil vraiment utile que j'ai développé en utilisant le transfert de données bidirectionnel est un « outil de modification par lot » quand je dois supprimer ou modifier un grand nombre d'événements similaires.

Par exemple, si nous devons changer le nom d'un enseignant pour une raison quelconque tout au long de l'année j'importe tous les événements pour un certain nombre de classe, remplacez le nom dans le tableur et mettez à jour le calendrier de classe ... cela me prend 5 minutes et est très facile mais ce sont des cas d'utilisation très spécifiques Je ne suis pas sûr que ce soit très commun

De toute façon, je n'appellerais pas cela "synchronisation" car cela ne prend que quelques événements et les change ... Je n'ai jamais essayé de garder un spreadshe et à jour avec un calendrier, de mon expérience les calendriers sont assez fiables et je les considère comme la source de données originale. Comme je l'ai déjà dit, nous importons des données dans des feuilles de calcul chaque semaine uniquement pour l'impression et l'archivage local.

Désolé pour cette longue et un peu vague commentaire (qui était trop long pour tenir dans un 500 chrs normale ;-) commentaire

Questions connexes