Question

Dans Google Sheets, j'ai une feuille avec les réponses du formulaire et à droite des colonnes du formulaire, j'ai des colonnes avec des formules qui utilisent les données du formulaire pour les fonctions.

Au début, j'avais étendu les formules sur les lignes afin qu'ils travaillent sur de nouvelles soumissions de formulaire, mais j'ai constaté que les nouvelles soumissions de formulaire effaceraient la ligne :(.

Au lieu d'étendre manuellement les formules après chaque soumission, j'ai installé Celui d'Andrew Stillman copyDown() scénario;ce qu'il fait, c'est copier les formules une fois les scripts soumis.

Maintenant, le problème que j'ai est que le script fonctionne lorsqu'il est exécuté manuellement, mais lorsque je déclenche le formulaire, il copie la formule sur cette feuille. et sur toutes les autres feuilles de la feuille de calcul.Je ne veux pas de cet effet secondaire, car cela gâche toute la feuille de calcul.:((

Ce que j'ai pensé faire, c'est modifier le script pour qu'il ne fonctionne que sur une seule feuille de réponse au formulaire, pas sur toutes les feuilles.Mais je ne sais pas comment faire ça.

Le nom de la feuille sur laquelle je veux qu'il s'exécute est "Demandes", et le gid=8.

Comment puis-je modifier ce script pour qu'il ne fonctionne que pour cette seule feuille ?

Était-ce utile?

La solution

Pour que le code s'exécute uniquement sur une feuille particulière, utilisez la méthode .getSheetByName().Par exemple:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var reqSh = ss.getSheetByName('Requests');

Il existe une autre manière qui pourrait être plus simple.Vous pouvez essayer de conserver une feuille uniquement pour les soumissions de formulaires et d'utiliser une formule matricielle dans une deuxième feuille pour copier toutes les valeurs de la première feuille dans la même plage dans la seconde.

=ARRAYFORMULA('Requests'!A1:H) copierait les colonnes A à H.

J'ai eu le même problème que toi et voici la solution.J'ai placé mes formules dans la deuxième feuille dans les colonnes à droite de la plage et je les ai copiées de la manière habituelle.Les formules faisaient référence à la plage copiée dans la deuxième feuille.Cela a fonctionné à merveille.

Je n’ai pas eu l’idée moi-même – je suis sûr qu’elle a été suggérée par quelqu’un sur le forum des feuilles de calcul Google.Je devrais vous donner un lien vers le post mais je viens de regarder et je ne le trouve pas.

Autres conseils

Dans votre code vous avez (commentaires dans le code)

 var sheets = ss.getSheets() [8]; // you choose sheet [8]
 var cellAddresses = new Object();
  for (var i=0; i<sheets.length; i++) { // but you enter a for loop that adresses every sheet in turn...
    var range = sheets[i].getDataRange();

Vous devez simplement supprimer cette boucle et utiliser uniquement le numéro de feuille auquel vous souhaitez procéder...

Le plus simple pourrait être de procéder ainsi :

 var i = 8
 var sheets = ss.getSheets() [i];
 var cellAddresses = new Object();
    var range = sheets[i].getDataRange();
  ...

et à la fin de la boucle, supprimez le } qui correspondait au for boucle

MODIFIER :le nouveau code devrait ressembler à ceci :

function copydown() {
  setCopyDownUid();
  setCopyDownSid();
  logCopyDown();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets() [8];
  var cellAddresses = new Object();
  var i=8
//  for (var i=0; i<sheets.length; i++) {
    var range = sheets[i].getDataRange();
    var lastRow = range.getLastRow();
    var values = range.getValues();
    for (var j=0; j<values.length; j++) {
      for (var k=0; k<values[j].length; k++) {
        var test = values[j][k].toString();
        var start = test.indexOf("copydown");
          if (start == 0) {
            start = start+10;
            var end = test.length-2;
            var length = end-start;
            var value = test.substr(start, length);
            var col = k+1;
            var nextRow = j+2;
            var numRows = lastRow-(nextRow-1);
            if (numRows>0) {
              var destRange = sheets[i].getRange(nextRow, col, numRows, 1);
              destRange.clear();
              var newLastRow = sheets[i].getDataRange().getLastRow();
              var newNumRows = newLastRow-(nextRow-1);
              var newDestRange = sheets[i].getRange(nextRow, col, newNumRows, 1);
              var cell = sheets[i].getRange(nextRow-1, col);
              cell.setFormula(value);
              cell.copyTo(newDestRange);
            }
            var cellAddress = cell.getA1Notation();
            cellAddresses[cellAddress] = test;
          }
      }
    }
    Utilities.sleep(500);
    resetCellValues(cellAddresses, sheets[i]);
  }
//}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top