Fonction Apps Script qui ne se lance pas
Bonjour,
Je débute avec google apps script et je viens de mettre en place une fonction trouvé sur le net et qui fonctionne plutôt bien sauf qu'il me faut la lancer manuellement pour que celle ci s'exécute.
Pouvez vous me dire comment fonctionne le déclanchement des fonctions svp ?
merci
Bonjour,
Pour ce qui est des déclencheurs (triggers),
- il y en a qui sont automatiques (avec quelques restrictions), notamment onOpen(), onInstall() et onEdit(e) pour les 3 plus importantes;
- onEdit(e) est très utilisée pour déclencher une action quand une donnée est entrée manuellement,
- onOpen(e) peut être utilisée pour afficher un menu personnalisé dans la barre de menu, ou sélectionner une feuille à l'ouverture par exemple
- ensuite, toutes les fonctions peuvent être déclenchées, pour cela, dans l'éditeur de script, il faut sélectionner l'horloge à gauche, ajouter un déclencheur en bas à droite et indiquer la fonction et les paramètres (cette action peut aussi être programmée avec un script)
si tu veux un conseil plus précis, n'hésite pas à en dire davantage sur ta fonction
Bonjour,
Merci pour les infos,
Ma fonction est asse lourde et en passant sur les déclencheurs (horloge a droite => change) ma fonction qui dure 2 min en temps normal, mais elle se lance plusieurs fois et ca donne des erreurs.
Je souhaiterai que quand il y ai un changement dans une page specifique ma fonction se déclanche,
Voici ma fonction :
function Crea_tabl() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const cor = ss.getSheetByName('correspondance');
const ecm = ss.getSheetByName('ECMQA');
const mp = ss.getSheetByName('Formations_My_Pulse');
const id = ss.getSheetByName('ID_corp');
// Last Row
var lrecm = ecm.getLastRow();
var lrmp = mp.getLastRow();
var lrcom = cor.getLastRow();
var lrid = id.getLastRow();
lrid = 120
values_ecm = ecm.getSheetValues(12,2,lrecm,4);
for(let v = 0 ; v < lrecm ; v++ ){
if (values_ecm[v][0] != ""){
cor.getRange(1+v,1).setValue(values_ecm[v][2]);
cor.getRange(1+v,2).setValue(values_ecm[v][0]);
//console.log(values_ecm[v][2])
//console.log(values_ecm[v][0])
}
}
// On copie le tableau et on supprime les doublons
var mypulseTab = id.getSheetValues(1,1,lrid,2);
var uniqueFormula = "UNIQUE(Formations_My_Pulse!A8:B"+lrmp+")";
id.getRange(1,1).setFormula(uniqueFormula);
// On boucle sur le fichier correspondance
for(var l = 0; l < lrcom ; l++){
//On transforme le tableau de correspondance
var tableauCorrespondanceNom = cor.getSheetValues(1,1,60,1);
var nomCor = split_nom(tableauCorrespondanceNom[l][0].toString())[0]
var nomCorEtoile = split_nom(tableauCorrespondanceNom[l][0].toString())[1]
// Verif tableau de correspondandce
console.log("Nom du fichier correspondance : "+ nomCor )
// on boucle sur le fichier mypulse par ligne du fichier correspondanse
for(var i = 0; i < lrid ; i++ ){
// Vérification du Nom Mypulse dan id
var mypulseTab = id.getSheetValues(1,1,lrid,2);
var mypulseNom = id.getRange(1+i,2).getValue()
console.log("Vérification du Nom Mypulse dans ID : "+mypulseNom)
// On compare les noms
if(mypulseNom == nomCor || mypulseNom == nomCorEtoile){
//On entre dans la cellules la valeur du fichier my pulse
cor.getRange(1+l,3).setValue(mypulseTab[i][0])
console.log("ca copie : "+ mypulseTab[i][0]+" "+nomCor)
}
}
}
}
function split_nom(nom){
return nom.split(" ")
}Merci pour vorte aide.
2 remarques
Ma fonction est asse lourde et en passant sur les déclencheurs (horloge a droite => change) ma fonction qui dure 2 min en temps normal, mais elle se lance plusieurs fois et ca donne des erreurs.
Cette durée n'est pas normale,
- Il faut que tu évites les appels à la feuille à l'intérieur des boucles, proscrire tous les getValue et setValue à l'intérieur d'une boucle, le faire en une seule fois pour toutes les données en dehors de la boucle avec les getValues et setValues (avec un s cette fois-ci) appropriés => tu réduiras fortement le temps d'exécution.
- De même, faire appel à une fonction de la feuille comme UNIQUE est élégant, mais une fonction codée en script dans ton cas serait plus rapide.
Je souhaiterai que quand il y ai un changement dans une page specifique ma fonction se déclanche,
Comme il n'y a pas de fonctions "exotique" un déclencheur n'est pas nécessaire. Et pour capter les feuilles ou plages, tu peux utiliser ceci, où x, y, v, w sont bien sûr des nombres
function onEdit(event) {
var feuille = event.source.getActiveSheet();
var cellule = event.source.getActiveRange();
if (cellule.getRow() >= x && cellule.getRow() <= y && cellule.getColumn() >= u && cellule.getColumn() <=w && feuille.getName() == 'maFeuille') {
// ici je lance le script
}Merci pour les conseils,
Je vais m'i mettre tout de suite, mais comment coder le Unuique en apps script et transformer en tableau y a t-il des tutos sur le sujet ?
je vois aussi que tu utilises la colonne B après avoir réduit les données pour en faire une liste unique, dans ce cas il me manque une donnée, qu'y a-t-il dans B qui dépendrait de A ?
peux-tu partager un fichier, ce serait plus simple, en tous cas je ne peux pas répondre sans savoir ce qu'il y a en B
Dans la colonne A il y a les ID et dans la colonne B les noms rattaché a ces ID
ok, mais cela veut dire que ces noms proviennent de quelque part avec une fonction vlookup je suppose ?
Pour obtenir une liste unique il y a 2 façons de faire :
1- la liste est à une dimension
function myFunction() {
const list = ['One', 'Two', 'Two', 'One', 'One', 'Two', 'One', 'Three'] // 1D
const unique = (value, index, self) => { return self.indexOf(value) === index; }
console.log (list.filter(unique));
}2- la liste est en réalité à 2 dimensions ou plus avec un identifiant et au moins un attribut, on utilisera dans ce cas ce que l'on pourrait appeler un dictionnaire
function myDictionary() {
let myDico = new Map()
var data = SpreadsheetApp.getActive().getDataRange().getValues()
Logger.log(data)
for (var i=0;i<data.length;i++){
myDico.set(data[i][0],data[i][1])
}
myDico.forEach(function(value, key) {
Logger.log(key + ' = ' + value)
})
}le principe est le suivant
function myDictionary() {
let myDico = new Map()
myDico.set('truc','x1')
myDico.set('truc','x2')
myDico.set('muche','y')
myDico.set('trucmuche','z')
Logger.log(myDico.has('truc'))
Logger.log(myDico.get('truc'))
Logger.log(myDico.size)
myDico.delete('truc')
Logger.log(myDico.size)
myDico.forEach(function(value, key) {
Logger.log(key + ' = ' + value)
})
}c'est à dire que je peux tester (.has), et aller chercher ensuite la valeur (.get)