web-dev-qa-db-fra.com

Obtenir des valeurs d'autres feuilles avec une fonction personnalisée

J'ai défini la fonction suivante et je l'utilise dans sheet1:

function  myfcn (sheetname,rowstart,rows,columnstart,rows){
    var sheet= SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetname);
    // sheetname is a parameter to my function  
    var range = sheet.getRange(rowstart,columnstart, 1,1);
    var x=range.getFormula();
    return x;
}

Dans la feuille 2, A1 a 100-B1. D1 a = 100-E1. (et ainsi de suite pour des centaines de formules) B1 a = x + y, E1 a = q + p. x, y, q & p sont des valeurs nommées. Le 100-B1 est en réalité une formule BEAUCOUP plus complexe, mais sert d'exemple.
Mon besoin est de créer un fichier .csv (à partir de la feuille 1) contenant les VALEURS (à partir de la feuille 2) dans A1, D1 etc. (avec = A1, etc.) et les FORMULES dans B1 et E1, etc. en utilisant myfcn. Le fichier .csv est ensuite utilisé en tant que pseudo-base de données où les visualiseurs sélectionnés (numérotés) peuvent voir UNIQUEMENT la ligne avec leur numéro. Les téléspectateurs voient un nombre et la formule (comme x + y) qui l’a créé. Il existe un fichier SEPARATE qui contient une simple liste des valeurs de x, y, q, p, etc.

Mais lorsque je modifie la valeur dans sheet2, elle n'est pas récupérée. De même, lorsque je sélectionne la cellule de la feuille 1 qui utilise la fonction et que j'appuie sur F2, Google indique qu'il s'agit d'une fonction inconnue.

Qu'est-ce que je fais mal?

1
DocDJ

Les fonctions personnalisées sont réexécutées lorsque leurs paramètres changent. Par exemple, si vous avez =myfcn("sheetname", 1, 1, 1, 1) et modifiez certains paramètres ici, la fonction sera exécutée à nouveau. Mais si vous modifiez le contenu du nom de la feuille de cellule! A1, la fonction sera non exécutée à nouveau, car aucune indication dans la feuille de calcul que sa sortie dépend du nom de la feuille! A1.

Alternative

Pour obtenir toutes les formules d'une feuille dans une autre feuille sous forme de texte, utilisez une fonction de script comme celle-ci:

function copyFormulas() {
  var sheet = SpreadsheetApp.getActiveSheet();
  if (sheet.getName() == 'Watched Sheet') {   
    var data = sheet.getDataRange();
    var target = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Formulas');
    target.getRange(1, 1, data.getHeight(), data.getWidth()).setValues(data.getFormulas());
  }   
}

La fonction prend les formules de 'Feuille surveillée' et les place dans la feuille 'Formules' sous forme de texte. Ce script peut être exécuté périodiquement, à chaque édition ou à chaque modification (y compris l'ajout de lignes, etc.). Voir déclencheurs .

2
user79865