2012-11-13 2 views
2

Bonjour
Mon problème est le suivant: Je souhaite créer une petite page Web sur laquelle il sera possible de créer un événement dans Google Agenda, mais avec quelques restrictions. Dans mon cas ce calendrier pourrait être édité par mes colocataires pour réserver une machine à laver. Cette réservation ne peut pas se chevaucher et nous avons tous un nombre limité de jours où nous pouvons l'utiliser.
J'ai créé calendrier privé, et j'ai créé un script qui valide les demandes, et si tout est ok ajouter un événement au calendrier. Ce script est exécuté en tant que moi (parce que seulement j'ai l'autorisation de modifier ce calendrier). Mais j'ai un problème avec l'extraction de l'information que l'utilisateur exécute ce script (moi ou un de mes colocataires). La classe Session contient 2 méthodes getActiveUser() et getEffectiveUser() mais l'utilisateur actif ne fonctionne pas (je suppose que c'est la politique de protection de la vie privée). Mais si je crée un autre script qui est exécuté comme utilisateur accédant au Web je peux obtenir l'utilisateur actif.
Est-ce que quelqu'un sait s'il est possible de communiquer d'une manière ou d'une autre entre ces 2 scripts embarqués sur le même site? Je veux passer l'email d'un utilisateur actif d'un script à un autre. Ou peut-être connaissez-vous une meilleure solution comment résoudre ce problème?Google Apps Script - communication entre script

Cordialement Adam

Répondre

0

Bien sûr, vous pouvez le faire, mais ce n'est pas aussi simple que vous le souhaitez. Faites en sorte que votre script de niveau d'administration exécute un service Web qui répond à l'autre script. Il peut probablement être piraté car vous ne pouvez pas authentifier les utilisateurs, mais comon, c'est un macine de lavage!

+0

"Il peut probablement être piraté": J'aimerais savoir comment. Puisque personne n'a accès au code du script "public" et qu'il fonctionne sur les serveurs de Google. Dans ma façon de le voir. Oui, il peut être piraté si vous avez accès aux serveurs Google. Mais si on peut le faire, je pense que les calendriers personnels sont en péril de toute façon. –

+0

@Henrique - Ce fil est mort, mais je viens de remarquer votre question. Notez que j'ai répondu avant que vous posté votre réponse plus approfondie mais je pense que mon affirmation s'applique toujours. La sécurité par l'obscurité (connaître une URL secrète) n'est généralement pas considérée comme une mesure efficace. Notez cependant que je ne disais pas que vous ne devriez pas faire cela, sachez simplement que votre événement de calendrier "privé" créant une URL pourrait être utilisé de manière malveillante s'il était trouvé et qu'il n'y aurait pas d'enregistrement d'audit pour indiquer lequel (utilisateur) l'a fait parce qu'il n'y a pas d'authentification; le service fonctionne comme vous. – mzimmerman

3

Comme vous l'avez remarqué, vous devez définir le script pour qu'il s'exécute lorsque l'utilisateur y accède pour recevoir son courrier électronique. Ensuite, au lieu d'accéder directement au calendrier (ce que vous ne pouvez évidemment pas), vous pouvez appeler un autre script publié, mais en cours d'exécution, autoriser l'accès anonyme qui recevra cette requête du script "visualisation" et créer les événements du calendrier. Après avoir publié ce script "background", récupérez son URL et utilisez-le sur un appel UrlfetchApp.fetch. Ensuite, passez les paramètres en tant que paramètres d'url (ou sur la charge utile si vous préférez utiliser post au lieu de get).

Le script d'arrière-plan peut même utiliser ContentService pour donner de bonnes valeurs de retour au script appelant.

+0

Des exemples de code pour cette technique? Jusqu'à présent mes tentatives ont échoué! Je pense que l'application de fond ne se lance pas. Voici une version simple de cette application de fond: 'function doPost (e) { if (typeof e === 'undefined') return; var app = UiApp.createApplication(); var panel = app.add (app.createVerticalPanel()); pour (var i dans e.parameter) { panel.add (app.createLabel (i + ':' + e.parameter [i])); Logger.log (i + ':' + e.paramètre [i]); } application de retour; } 'Bien sûr, le problème principal est peut-être que la deuxième application n'ouvre pas réellement une (nouvelle) fenêtre même si elle s'exécute. – wgw