IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

APIs Google Discussion :

MAJ Google Sheet en fonction de Google Agenda [Google Sheets]


Sujet :

APIs Google

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé de projet événementiel
    Inscrit en
    Avril 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé de projet événementiel

    Informations forums :
    Inscription : Avril 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut MAJ Google Sheet en fonction de Google Agenda
    Hello le forum !

    Je n'ai pas l'habitude d'écrire pour demander un coup de main, je trouve en général toutes mes réponses sur des discussions déjà existantes, mais là c'est le drame !

    J'ai l'habitude de travailler sur excel, de faire du VBA, et dans mon nouveau job c'est google sheet uniquement ! Je viens de découvrir qu'on pouvait faire des macros dessus, je pensais m'y retrouver mais je suis un peu perdu..

    En gros, j'ai un agenda google avec des horaires de montage pour des événements, exemple : titre : "*Amandine MONT #35618 Workshop - Sid Lee - 4 fevrier 2019" // les heures : "Vendredi, 1 février⋅1:00 à 3:00pm"

    J'ai à coté de ça une google sheet avec plusieurs colonnes, notamment la colonne I avec le numéro de commande (comme sur l'exemple "35618"), colonne G avec l'heure de montage, et colonne H avec l'heure de démontage. J'aimerai avec tout ça, si il y a une modification de l'agenda, en fonction du numéro de commande et si il y a écrit MONT ou DEMONT dans l'évènement, que ça modifie automatiquement les heures de mes colonnes MONT et DEMONT dans la google sheet.

    J'ai commencé à fouiller les possibilités en script :

    - je sais qu'en variable je peux avoir ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var mycal = "dxmobilier.com_uo4h62q62qh5nk76sh1elmaoak@group.calendar.google.com";
    var cal = CalendarApp.getCalendarById(mycal);
    - il me faudra une loop pour descendre dans mes colonnes avec une recherche de mot avec le numéro de commande, mont et demont

    - j'ai trouvé également ça sur un site : var events = cal.getEvents(new Date("May 12, 2019 00:00:00 CST"), new Date("January 18, 2019 23:59:59 CST"), {search: '-project123'});, search me permettrait donc de chercher n'importe quelle expression présente dans le nom de l'événement ? Et ayant une google sheet pour chaque jour avec la date inscrite en B2, j'imagine qu'il vaut mieux que je parte sur quelque chose comme ça : getEventsForDay(date, options) ? Avec en critère pour la date ma cellule B2.

    Je suis un peu perdu avec ce langage, et c'est pourquoi je vous demande de l'aide pour pouvoir m'orienter sur le bon chemin !

    Merci d'avance !

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 485
    Points : 13 695
    Points
    13 695
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Je n'ai pas encore fait joujou avec Calendar, donc je vais plus te guider que te trouver une solution

    Déjà, il y a quelque chose qui me choque :
    "*Amandine MONT #35618 Workshop - Sid Lee - 4 fevrier 2019" // les heures : "Vendredi, 1 février⋅1:00 à 3:00pm"
    Le nom de l’événement contient une date qui est fausse en fait ?

    Pour moi, ça soulève le fait que justement ton événement peut changer d'horaires mais aussi de jour.

    Quel est le but de ta feuille Google Sheet ? Elle doit analyser ton calendrier pour résumer les événements ? Elle contient des données que tu souhaites compléter grâce aux événements ? Dans le premier cas, tu peux faire une recherche de tous les événements depuis 2000 et analyser les résultats. Ça fonctionnera mais ça prendra un peu de temps. Dans le second cas, pourquoi chercher par jour et non pas par ID de projet ?

    Sans voir la tête de ton fichier Sheet c'est pas facile de visualiser. Peux-tu faire une capture d'écran (même avec des donnés bidons pour l'exemple) ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé de projet événementiel
    Inscrit en
    Avril 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé de projet événementiel

    Informations forums :
    Inscription : Avril 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Hello !

    Déjà merci pour ta réponse, je t'avoue que c'est une bonne remarque pour le nom de l'événement ˆˆ
    Je ne sais pas du tout comment il s'organise, ce n'est pas pour moi, j'aide mon collègue coordonnateur, j'imagine qu'il y a une raison particulière, je lui demanderai demain !
    Au final le besoin à changer, j'ai réussi à pondre quelque chose qui fonctionne, mais il me manque encore quelques infos.

    En gros ce tableau, c'est un récapitulatif de l'agenda, sous format sheet, et apparemment ça aide bien nos installateurs pour le montage.
    Dans les images je t'ai mis le tableau tel qu'il est aujourd'hui, et avec ça la version que j'ai fait. En gros là les éléments que je n'arrive pas encore à automatiser, ils sont dans le nom de l'événement, et je sais pas trop comment les récupérer, peut être avec une recherche de caractères..

    Pour la colonne B, je vais lui demander d'inviter le chef d'équipe dans l'event comme ça je vais pouvoir récupérer facilement le nom en guest, et pour la I, si il met le numéro de commande dans la description de l'event (à la place du jour d'ajout de l'event, que je peux récup facilement si il en a vraiment besoin), pareil, je devrais pouvoir le trouver.

    Nom : Screenshot Capture - 2019-04-30 - 16-14-40.png
Affichages : 392
Taille : 215,5 KoNom : Screenshot Capture - 2019-04-30 - 16-09-32.png
Affichages : 382
Taille : 185,9 Ko

    En fait en dehors des colonnes qu'ils doivent remplir manuellement, il me manquera le nombre de camion, qui est dans le titre, et que je dois mettre dans la colonne J, et là, ça coince. Des idées ?

    J'espère que vous me comprendrez ˆˆ

    Voilà le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     
    function le_travail_d_arnaud(){
     
    var mycal = "dxmobilier.com_uo4h62q62qh5nk76sh1elmaoak@group.calendar.google.com";
    var cal = CalendarApp.getCalendarById(mycal);
     
    var sheet = SpreadsheetApp.getActiveSheet();
    var cellule = (sheet.getRange("B1").getValue());
     
    var events = cal.getEventsForDay(new Date(cellule), {search: '-PICK'});
     
    sheet.getRange(3,1,30,14).clear({contentsOnly:true});
     
    for (var i=0;i<events.length;i++) {
    var row=i+3;
    var space = '';
     
    var names = "";
    var guestList = events[i].getGuestList();
    for ( var n = 0; n < guestList.length; n++ ) {
      var name = guestList[n].getName(); 
      if ( name ) {
        names += name + ', ';
      }
     
    }
     
    sheet.getRange(row,2).setValues([[names]]);
     
          var ev = events[i];
          var title = cal.getEventSeriesById(ev.getId()).getTitle();
     
     
          if (title.indexOf("DEMONT")>-1){
            sheet.getRange(row,8).setValues([[events[i].getStartTime()]]);
            }
     
            else {sheet.getRange(row,7).setValues([[events[i].getStartTime()]]);
            }
     
     
    sheet.getRange(row,9).setValues([[events[i].getDescription()]]);
    sheet.getRange(row,12).setValues([[events[i].getTitle()]]);
    sheet.getRange(row,13).setValues([[events[i].getLocation()]]);
     
    }
    }

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 485
    Points : 13 695
    Points
    13 695
    Billets dans le blog
    1
    Par défaut
    C'est mon boulot de poser ce genre de questions

    Tu devrais faire à l'indentation de ton code, j'avoue m'être un peu perdu... Quelques commentaires ne tuent pas non plus

    Et en fait non je ne comprends pas vraiment la question ah ah ! Dans l'exemple de titre, je ne vois pas quelle partie correspondrait au nombre de camion...

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé de projet événementiel
    Inscrit en
    Avril 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé de projet événementiel

    Informations forums :
    Inscription : Avril 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Je suis désolé, j'ai mélangé pas mal de trucs que j'ai trouvé sur internet et il est encore très brouillon, je vais essayer de refaire des commentaires propres ! ˆˆ
    En fait là tu peux voir sur le tableau que j'ai partagé toutes les infos que j'ai réussi à récupérer. Il me manque le chef d'équipe, le nombre de camion et le numéro de commande. Ce sont toutes des infos qui sont dans le titre d'un événement.

    Exemple : "1 camion 3 personnes Fanny DEMONT# 35822 Brother - Oxygene - 30 Avril 2019"

    Je pense proposer au coordonnateur lors de sa création de l'événement sur google agenda, d'inviter le chef d'équipe dans l'event, comme ça je récupère l'info via getGuestList / getName
    Je lui dirai bien de mettre le nombre de camion ou le numéro dans la description, que je pourrais récup via getDescription, mais ça veut dire qu'il y a un dernier élément, soit les camions, soit le num de commande que je sais pas comment récupérer..

    Edit : et oui, info importante, le coordo rajoute certains éléments après la création de l'event (comme le nombre de camions), d'ou l'intérêt d'automatiser la google sheet ˆˆ

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 485
    Points : 13 695
    Points
    13 695
    Billets dans le blog
    1
    Par défaut
    Quand tu as un texte et que tu veux extraire des informations de ce texte, il faut te tourner vers les expressions régulières.

    Regarde ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function extractPeople(description) {
      var regexp = new RegExp('[0-9]+ personne[s]*');
     
      if(regexp.test(description)) {
        var result = regexp.exec(description);
        // 'result' est un tableau de résultats, on suppose qu'il y en a un seul (result[0])
        // on sépare la chaine selon le caractère espace (split(' ')
        // et on garde la première partie ([0])
        var count = result[0].split(' ')[0];
        // --> on obtient un nombre
        Logger.log('People = ' + count);
      } else {
       Logger.log('No people count in description'); 
      }
    }
     
    function example() {
      extractPeople('1 camion 3 personnes Fanny DEMONT# 35822 Brother - Oxygene - 30 Avril 2019');
      extractPeople('1 camion 1 personne Fanny DEMONT# 35822 Brother - Oxygene - 30 Avril 2019');  
      extractPeople('1 camion Fanny DEMONT# 35822 Brother - Oxygene - 30 Avril 2019');
    }
    Voici les logs générés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [19-05-02 09:47:39:987 CEST] People = 3
    [19-05-02 09:47:39:988 CEST] People = 1
    [19-05-02 09:47:39:988 CEST] No people count in description

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé de projet événementiel
    Inscrit en
    Avril 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé de projet événementiel

    Informations forums :
    Inscription : Avril 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Merci pour la function !! Mais je t'avoue ne pas trop la comprendre ˆˆ
    Du coup elle me permettrait d'extraire le nombre de personnes, le nombre de camions et le numéro de commande du titre de l'event ? Et si dans le titre il n'y a pas encore indiqué le nombre de camions et de personnes, ça peut marcher quand même, en m'indiquant que l'info est pas encore dispo ?

    Merci

    Edit : j'ai essayé d'adapter cette nouvelle function pour mon cas avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sheet.getRange(row,10).setValues(extractPeople([[events[i].getTitle()]]));
    Mais ça ne fonctionne pas.. une idée de mon erreur ?

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 485
    Points : 13 695
    Points
    13 695
    Billets dans le blog
    1
    Par défaut
    A un moment, il faut comprendre un peu le code, sinon tu ne pourras avancer Même si ça demande un peu de temps !

    As-tu compris ce qu'est une expression régulière, au moins le principe ?

    As-tu compris que ma fonction teste la présence dans le texte avec if(regexp.test(description)) ?

    As-tu compris que cette fonction ne retourne rien et que donc tu n'as pas de paramètres à ton setValues() (qui devrait plutôt être un setValue() je pense) ?

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé de projet événementiel
    Inscrit en
    Avril 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé de projet événementiel

    Informations forums :
    Inscription : Avril 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Oui oui j'essaye bien, je comprend des morceaux mais pas tout.. Je ne connaissais pas le terme d'expression régulière, je viens de voir les possibilités avec Google Script et je vois bien le principe. J'ai vu pour le test, il y a pas de soucis !
    Je pensais que la function retournait une valeur, puisqu'au final elle nous fait bien la séparation des éléments. Du coup comment fonctionne t-elle à la fin si elle ne retourne pas de valeur ? Et comment en ressortir une ?
    Oui pour setValue c'est une erreur de ma part !

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 485
    Points : 13 695
    Points
    13 695
    Billets dans le blog
    1
    Par défaut
    Ben...... C'est là qu'il faut un peu chercher à accrocher les morceaux

    1) La fonction appelle Logger.log() ce qui affiche un message dans la console de logs
    Voir https://developers.google.com/apps-s...ce/base/logger et https://developers.google.com/apps-s...guides/logging

    2) Pour retourner une valeur, ben il faut une instruction return https://developer.mozilla.org/fr/doc...uctions/return
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function extractPeople(description) {
      var regexp = new RegExp('[0-9]+ personne[s]*');
     
      if(regexp.test(description)) {
        var result = regexp.exec(description);
        var count = result[0].split(' ')[0];
        return count;
      } else {
        return 0;
      }
    }

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé de projet événementiel
    Inscrit en
    Avril 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé de projet événementiel

    Informations forums :
    Inscription : Avril 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Oui c'est ce que j'essaye de faire depuis le début, d'assembler les bons morceaux et de les comprendre, mais y'a des moments c'est compliqué pour moi... comme logger.log que je ne connaissais pas, merci pour le lien, je comprend mieux !

    Ça marche super bien, merci beaucoup ! Du coup je l'ai adapté aussi pour le nombre de camion, je vais pouvoir récupérer les personnes et les camions, c'est top ! Je suis en train de me demander aussi si elle ne s'adapterait pas pour un peu réduire le nom de l'événement, c'est à dire sur ça, prendre tout ce qui vient après le numéro de commande :

    - "*1 camion 2 personnes Loupol MONT# 36266 Bal des finissants - AESPEIUM - 3 mai 2019" // soit "Bal des finissants - AESPEIUM - 3 mai 2019""

    Tu penses que je peux adapter ta formule initiale , ou il faudrait que je parte sur un autre genre de function ?

    Edit : j'ai tenté aussi de l'utiliser pour le numéro de commande vu qu'elle marche bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function extractOrder(description) {
      var regexp = new RegExp('# +[0-99999]*');
     
      if(regexp.test(description)) {
        var result = regexp.exec(description);
        var count = result[0].split(' ')[1];
        return count;
      } else {
        return 1;
      }
    }
    Je peux demander au coordonnateur de toujours mettre un espace entre le # et le numéro, mais pour mieux comprendre la function, je voulais essayer de rendre l'espace optionnel en faisant comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     var regexp = new RegExp('#[ ]+[0-99999]*');
    mais ça n'a pas l'air de fonctionner..

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 485
    Points : 13 695
    Points
    13 695
    Billets dans le blog
    1
    Par défaut
    Quand tu ne connais pas une fonction ou une classe, la documentation officielle est ton amie : https://developers.google.com/apps-s...e/spreadsheet/

    Il ne faut pas non plus perdre de vue qu'Apps Script, c'est du JavaScript et que les tutoriels et les documentations JavaScript s'appliquent en grande partie : https://developer.mozilla.org/fr/doc...ript/Reference

    L'expression régulière que tu cherches est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var regexp = new RegExp('#[ ]*[0-9]+');
    * veut dire "0 ou plus" alors que + veut dire "1 ou plus". Remarque aussi que [0-9] suffit : ça liste les caractères en 0 et 9. [0-99999] veut dire "un caractère entre 0 et 9" ou "le caractère 9" ou "le caractère 9" ou "le caractère 9" ou "le caractère 9" (oui, oui, j'ai répété 4 fois intentionnellement )

    Tu y étais presque, ça commence à venir ! Les regexp, c'est franchement pas le plus simple...

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé de projet événementiel
    Inscrit en
    Avril 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé de projet événementiel

    Informations forums :
    Inscription : Avril 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Génial ! Oui oui pour toutes les expressions en rapport avec event, je me suis bien servi des pages google pour m'aider ! J'avais chercher pour regexp, mais je ne l'avais pas trouvé !

    D'accord, je comprend beaucoup mieux pour les + et *, merci Je ne savais pas pour [0-9], je pensais qu'il fallait lui donner un ensemble défini entre 2 limites ˆˆ

    Par contre je viens d'essayer ce que tu me proposes, toujours aucun soucis quand il y a un espace entre # et le numéro, par contre je me retrouve avec un undefined pour les cas ou il n'y a pas d'espace :/

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé de projet événementiel
    Inscrit en
    Avril 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé de projet événementiel

    Informations forums :
    Inscription : Avril 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Hello Bktero !

    Je reviens vers toi car je suis presque à la fin de mon script ! Il marche plutôt bien mais, il y a encore 2 petits soucis actuellement !

    Je l'ai refais au propre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
     
     
    function extractPeople(description) {
      var regexp = new RegExp('[0-9]+ personne[s]*');
     
      if(regexp.test(description)) {
        var result = regexp.exec(description);
        var count = result[0].split(' ')[0];
        return count;
      } else {
        return 0;
      }
    }
     
    function extractTruck(description) {
      var regexp = new RegExp('[0-9]+ camion[s]*');
     
      if(regexp.test(description)) {
        var result = regexp.exec(description);
        var count = result[0].split(' ')[0];
        return count;
      } else {
        return 0;
      }
    }
     
    function extractOrder(description) {
      var regexp = new RegExp('#[ ]*[0-9]+');
     
      if(regexp.test(description)) {
        var result = regexp.exec(description);
        var count = result[0].split(' ')[1];
        return count;
      } else {
        return 0;
      }
    }
     
    function la_job(){
     
      //variables de mon calendrier
     
      //le calendrier des horaires
      var mycal = "dxmobilier.com_uo4h62q62qh5nk76sh1elmaoak@group.calendar.google.com";
      var cal = CalendarApp.getCalendarById(mycal);
     
      //la google sheet en cours
      var sheet = SpreadsheetApp.getActiveSheet();
     
      //la cellule contenant la date
      var cellule = (sheet.getRange("B1").getValue());
     
      //les événements qui ne contiennent pas les mots "PICKUP", "ND", "grimpe" et "PICK"
      var events = cal.getEventsForDay(new Date(cellule), {search: '-PICKUP -ND -grimpe -PICK'});
     
      //boucle de la liste d'events
      for (var i=0;i<events.length;i++) {
        var space = '';
        var ev = events[i];
        var title = cal.getEventSeriesById(ev.getId()).getTitle();
     
        //mon déclencheur
        var x=0;
     
        //boucle des lignes dans la sheet
        var order = extractOrder([[events[i].getTitle()]]);
        for (var row = 3;sheet.getRange(row,9).getValue() !="";row++) {
     
        //vérification même order, montage ou démontage  
        var col = 0
        var titre = 0
     
          if (sheet.getRange(row,7).getValue() !=""){
            col = 1}
          else { col = 0}      
     
          if (title.indexOf("DEMONT")>-1){
            titre = 0}
          else { titre = 1}
     
          if (order == sheet.getRange(row,9).getValue() && col == titre){
     
                  //tout le merdier de rajout
     
            //loop pour la guestlist
            var names = "";
            var guestList = events[i].getGuestList();
            for ( var n = 0; n < guestList.length; n++) {
              var name = guestList[n].getName(); 
              if ( name ) {
                names += name + ', ';
              }
              //fin de loop gueslist  
            }
            //sheet.getRange(row,2).setValues([[names]]);
     
     
            sheet.getRange(row,2).setValues([[guestList.getName]]);
     
     
            if (title.indexOf("DEMONT")>-1){
              sheet.getRange(row,8).setValues([[ev.getStartTime()]]);
            }
     
            else {sheet.getRange(row,7).setValues([[ev.getStartTime()]]);
                 }
     
     
                  //matin, après-midi, soirée ou nuit
            var date = ev.getStartTime();
            var heure = date.getHours();
     
            if (heure > 5 && heure < 12){
              sheet.getRange(row,4).setValue("MATIN")}
            else if (heure >= 12 && heure < 18){
              sheet.getRange(row,4).setValue("APRÈS-MIDI")}
            else if (heure >= 18 && heure < 22){
              sheet.getRange(row,4).setValue("SOIRÉE")}
          else {
              sheet.getRange(row,4).setValue("NUIT")}
     
            //au cas ou si cette info est utile
            //var people = extractPeople([[events[i].getTitle()]]);
            //sheet.getRange(row,10).setValue(people)  
     
            var order = extractOrder([[ev.getTitle()]]);
            sheet.getRange(row,9).setValue(order);
     
            var truck = extractTruck([[ev.getTitle()]]);
            sheet.getRange(row,10).setValue(truck);
     
            sheet.getRange(row,12).setValues([[ev.getTitle()]]);
            sheet.getRange(row,13).setValues([[ev.getLocation()]]);
            sheet.getRange(row,14).setValues([[ev.getDateCreated()]]);
     
            //mon déclencheur
            x=1;
     
          }
     
        }
     
     
        if (x == 0){
     
          //tout le merdier de rajout
     
            //loop pour la guestlist
            var names = "";
            var guestList = ev.getGuestList();
            for ( var n = 0; n < guestList.length; n++) {
              var name = guestList[n].getName(); 
              if ( name ) {
                names += name + ', ';
              }
              //fin de loop gueslist  
            }
            //sheet.getRange(row,2).setValues([[names]]);
     
            //var guestList=events[i].getGuestList();
     
            sheet.getRange(row,2).setValues([[guestList.getName]]);              
     
     
            if (title.indexOf("DEMONT")>-1){
              sheet.getRange(row,8).setValues([[ev.getStartTime()]]);
            }
     
            else {sheet.getRange(row,7).setValues([[ev.getStartTime()]]);
                 }
     
                  //matin, après-midi, soirée ou nuit
            var date = ev.getStartTime();
            var heure = date.getHours();
     
            if (heure > 5 && heure < 12){
              sheet.getRange(row,4).setValue("MATIN")}
            else if (heure >= 12 && heure < 18){
              sheet.getRange(row,4).setValue("APRÈS-MIDI")}
            else if (heure >= 18 && heure < 22){
              sheet.getRange(row,4).setValue("SOIRÉE")}
          else {
              sheet.getRange(row,4).setValue("NUIT")}
     
            //au cas ou si cette info est utile
            //var people = extractPeople([[events[i].getTitle()]]);
            //sheet.getRange(row,10).setValue(people)  
     
            var order = extractOrder([[ev.getTitle()]]);
            sheet.getRange(row,9).setValue(order);
     
            var truck = extractTruck([[ev.getTitle()]]);
            sheet.getRange(row,10).setValue(truck);
     
            sheet.getRange(row,12).setValues([[ev.getTitle()]]);
            sheet.getRange(row,13).setValues([[ev.getLocation()]]);
            sheet.getRange(row,14).setValues([[ev.getDateCreated()]]);
     
        }
     
      }
     
    }
    Mon 1er problème est plutot une volonté de raccourcir le tout. Comme tu vois, il y a un gros morceau (celui qui écrit toutes mes infos sur mon tableau) que je répète 2 fois. J'ai chercher pendant des heures sans trouver de réponses sur comment "appeler" ce morceau les 2 fois pour éviter de me répeter. J'ai pensé à en faire une function, mais avec les variables c'était compliqué..

    Et le dernier truc, c'est que je n'arrive pas à faire fonctionner la guestlist ! Elle me renvoit le nom de la personne qui a crée l'événement (qui est aussi celui qui m'a invité sur cet event), mais pas le mien !

    Est-ce que tu as des idées sur ce qui ne va pas dans mon script ?

    Merci à toi du coup de main

  15. #15
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 485
    Points : 13 695
    Points
    13 695
    Billets dans le blog
    1
    Par défaut
    Je ne comprends pas du tout la logique... Mais comme je ne connais pas la structure de ton fichier, c'est plutôt normal.

    C'est quoi ce x qui sert de déclencheur ? x c'est un très mauvais nom de variable (sauf pour l'abscisse d'un point ou une inconnue dans une équation). Pourquoi ne pas lui donner un nom plus explicite et des valeurs plus claires ? Pense à

    Pour factoriser du code, il faut faire une fonction. C'est (presque) aussi simple que ça. Mais là ton bout de code est exactement le même, il n'y a même pas de paramètre. Tu peux peut-être t'en sortir en revoyant la logique pour exécuter cette suite d'action. Par exemple : true et false plutôt que 0 et 1.

    PS : voici quelques remarques supplémentaires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                //loop pour la guestlist
                var names = "";
                var guestList = ev.getGuestList();
                for (var n = 0; n < guestList.length; n++) {
                    var name = guestList[n].getName();
                    if (name) {
                        names += name + ', ';
                    }
                    //fin de loop gueslist  
                }
    Ce bout de code devrait pouvoir être remplacé (et donc allégé) avec un join() : https://www.tutorialspoint.com/How-t...separated-list

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                var order = extractOrder([
                    [ev.getTitle()]
                ]);
    Pourquoi tu mets des crochets ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var cellule = (sheet.getRange("B1").getValue());
    date serait sans doute un meilleur nom. Ca semble du détails mais c'est ce qui rend ton code plus facile à comprendre. Aujourd'hui, tu ne voi peut-être pas la différence, mais dans 6 mois quand tu reprendras le code, tu seras content d'avoir fait ce genre d'efforts. Si c'est un collègue qui reprend le code, il sera encore plus content !

    Tes fonctions d'extraction peuvent être factorisées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    function extra(description, regexp) {
        if (regexp.test(description)) {
            var result = regexp.exec(description);
            var count = result[0].split(' ')[1];
            return count;
        } else {
            return 0;
        }
    }
     
    function extractPeople(description) {
        var regexp = new RegExp('[0-9]+ personne[s]*');
       return extract(description, regexp);
    }
     
    function extractTruck(description) {
        var regexp = new RegExp('[0-9]+ camion[s]*');
        return extract(description, regexp);
    }
     
    function extractOrder(description) {
        var regexp = new RegExp('#[ ]*[0-9]+');
        return extract(description, regexp);
    }
    Ca allège un peu le code mais je te montre surtout ça pour exercer ton esprit à créer des fonctions

  16. #16
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé de projet événementiel
    Inscrit en
    Avril 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé de projet événementiel

    Informations forums :
    Inscription : Avril 2019
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Hello !

    Je suis désolé de t'avoir déranger pour rien.. J'ai repensé au fait que tu m'as dit qu'en soit c'était du javascript, et je me suis rendu compte que mon pote développeur pouvait peut être me filer un coup de main ^^ Il m'a raccourci l'ensemble et corrigé ce qu'il n'allait pas !

    Pour x, je ne savais comment m'y prendre autrement.. En fait c'est quand on vérifie un event i de sa présence dans le tableau. Si il est présent, x= 1 et du coup je ne refait pas le rajout de toutes les infos une 2 ème fois en bas du tableau, et si il est pas là, x=0 et du coup on rajoute l'évènement en bas du tableau !

    Voilà le code final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
     
     
    function extractPeople(description) {
        var regexp = new RegExp('([0-9]+) personne[s]*', 'i');
     
        if (regexp.test(description)) {
            var result = regexp.exec(description);
            return result[1];
        } else {
            return 0;
        }
    }
     
    function extractTruck(description) {
        var regexp = new RegExp('([0-9]+) camion[s]*', 'i');
     
        if (regexp.test(description)) {
            var result = regexp.exec(description);
            return result[1];
        } else {
            return 0;
        }
    }
     
    function extractOrder(description) {
        var regexp = new RegExp('#[ ]*([0-9]+)', 'i');
     
        if (regexp.test(description)) {
            var result = regexp.exec(description);
            return result[1];
        } else {
            return 0;
        }
    }
     
    function extractTitle(description) {
        var regexp = new RegExp('#[ ]*[0-9]+ (.*)', 'i');
     
        if (regexp.test(description)) {
            var result = regexp.exec(description);
            return result[1];
        } else {
            return 0;
        }
    }
     
    function extractTeamLeader(description, teamLeaders) {
        for (var i in teamLeaders) {
            if (description.toLowerCase().indexOf(teamLeaders[i].toLowerCase()) > -1) {
                return teamLeaders[i];
            }
        }
     
        return '';
    }
     
    function la_job_final() {
     
        //variables de mon calendrier
     
        //le calendrier des horaires
        var mycal = "dxmobilier.com_uo4h62q62qh5nk76sh1elmaoak@group.calendar.google.com";
        var cal = CalendarApp.getCalendarById(mycal);
     
        //la google sheet en cours
        var sheet = SpreadsheetApp.getActiveSheet();
     
        //la cellule contenant la date
        var cellule = (sheet.getRange("B1").getValue());
     
        //les événements qui ne contiennent pas les mots "PICKUP", "ND", "grimpe" et "PICK"
        var events = cal.getEventsForDay(new Date(cellule), { search: '-PICKUP -ND -grimpe -PICK -Bloc' });
     
        var teamLeaders = [];
        for (var c = 3; c < 99; c++) {
            var cell = sheet.getRange(c, 18).getValue();
     
            if (cell != '') {
                teamLeaders.push(cell);
            }
            else {
                break;
            }
        }
     
        function setRowData(row, event, title) {
     
     
     
            if (title.indexOf("DEMONT") > -1) {
                sheet.getRange(row, 8).setValues([
                    [event.getStartTime()]
                ]);
            } else {
                sheet.getRange(row, 7).setValues([
                    [event.getStartTime()]
                ]);
            }
     
            //au cas ou si cette info est utile
            //var people = extractPeople([[event.getTitle()]]);
            //sheet.getRange(row,10).setValue(people) 
     
            var teamLeader = extractTeamLeader(event.getTitle(), teamLeaders); 
            sheet.getRange(row, 2).setValue(teamLeader);
     
            var order = extractOrder([
                [event.getTitle()]
            ]);
            sheet.getRange(row, 9).setValue(order);
     
            var truck = extractTruck([
                [event.getTitle()]
            ]);
            sheet.getRange(row, 10).setValue(truck);
     
            var title = extractTitle([
                [event.getTitle()]
            ]);
            sheet.getRange(row, 12).setValue(title);
     
            sheet.getRange(row, 13).setValues([
                [event.getLocation()]
            ]);
            sheet.getRange(row, 14).setValues([
                [event.getDateCreated()]
            ]);
     
     
                  //matin, après-midi, soirée ou nuit
            var date = event.getStartTime();
            var heure = date.getHours();
     
            if (heure > 5 && heure < 12) {
                sheet.getRange(row, 4).setValue("MATIN")
            } else if (heure >= 12 && heure < 18) {
                sheet.getRange(row, 4).setValue("APRÈS-MIDI")
            } else if (heure >= 18 && heure < 22) {
                sheet.getRange(row, 4).setValue("SOIRÉE")
            } else {
                sheet.getRange(row, 4).setValue("NUIT")
            }
        }
     
        //boucle de la liste d'events
        for (var i = 0; i < events.length; i++) {
            var space = '';
            var event = events[i];
            var title = cal.getEventSeriesById(event.getId()).getTitle();
     
            //variables de vérification que l'event soit le jour J    
            var jourJ = new Date(cellule)
            var jourI = event.getStartTime()
     
            //mon déclencheur
            var x = 0;
     
            //boucle des lignes dans la sheet
            var order = extractOrder([
                [event.getTitle()]
            ]);
     
            for (var row = 3; sheet.getRange(row, 9).getValue() != ""; row++) {
     
              var addn = sheet.getRange(row, 14).getValue().getTime()
              var addi = events[i].getDateCreated().getTime()
     
                if (order == sheet.getRange(row, 9).getValue() && addn == addi && jourI > jourJ) {
     
                    //tout le merdier de rajout
                    setRowData(row, event, title);
     
                    //mon déclencheur
                    x = 1;
     
                }
     
            }
     
     
            if (x == 0 && jourI > jourJ) {
     
                //tout le merdier de rajout
                setRowData(row, event, title);
     
            }
     
        }
     
    }
    Et le tableau

    Nom : Screenshot Capture - 2019-05-14 - 09-10-34.png
Affichages : 328
Taille : 218,9 Ko

    Merci beaucoup pour ton aide, j'y serai pas arrivé sans toi !

  17. #17
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 485
    Points : 13 695
    Points
    13 695
    Billets dans le blog
    1
    Par défaut
    Content d'avoir pu t'aider ! Bonne continuation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Calendrier] lien Google Agenda et Excel
    Par loic22 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 04/03/2016, 20h19
  2. Réponses: 0
    Dernier message: 01/09/2008, 19h33
  3. Quels outils pour site applicatif comme Google Agenda ?
    Par tiz dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 04/10/2007, 00h12
  4. [Calendrier] Exploiter le calendrier Google Agenda dans un site web PHP
    Par Malacéine dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 14/09/2007, 13h20
  5. Outlook et mail de notification google agenda
    Par megane dans le forum Outlook
    Réponses: 2
    Dernier message: 03/05/2007, 10h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo