Frage

In Google Sheets habe ich ein Blatt mit Formularantworten und rechts neben den Formularspalten habe ich Spalten mit Formeln, die Formulardaten für Funktionen verwenden.

Zu Beginn hatte ich die Formeln zeilenweise erweitert, sodass sie bei neuen Formularübermittlungen funktionierten, stellte jedoch fest, dass neue Formularübermittlungen die Zeile leeren würden :(.

Anstatt die Formeln nach jeder von mir installierten Übermittlung manuell nach unten zu erweitern Andrew Stillmans copyDown() Skript;Es kopiert die Formeln nach der Übermittlung der Skripte.

Das Problem, das ich jetzt habe, ist, dass das Skript funktioniert, wenn es manuell ausgeführt wird, aber wenn ich es so einstelle, dass es beim Absenden des Formulars auslöst, kopiert es die besagte Formel auf dieses Blatt Und auf allen anderen Blättern in der Tabelle.Ich möchte diesen Nebeneffekt nicht, da er die gesamte Tabelle durcheinander bringt.:((

Ich dachte daran, das Skript so zu bearbeiten, dass es nur auf einem Formularantwortblatt funktioniert, nicht auf allen Blättern.Aber ich weiß nicht, wie ich das machen soll.

Der Name des Blattes, auf dem es ausgeführt werden soll, ist „Requests“ und das gid=8.

Wie bearbeite ich dieses Skript so, dass es nur für dieses eine Blatt funktioniert?

War es hilfreich?

Lösung

Damit Code nur auf einem bestimmten Blatt ausgeführt wird, verwenden Sie die Methode .getSheetByName().Zum Beispiel:

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

Es gibt einen anderen Weg, der vielleicht einfacher ist.Sie könnten versuchen, ein Blatt ausschließlich für Formularübermittlungen beizubehalten und in einem zweiten Blatt eine Array-Formel zu verwenden, um alle Werte aus dem ersten Blatt in denselben Bereich im zweiten zu kopieren.

=ARRAYFORMULA('Requests'!A1:H) würde die Spalten A nach H kopieren.

Ich hatte das gleiche Problem wie Sie und das war die Lösung.Ich habe meine Formeln im zweiten Blatt in den Spalten rechts vom Bereich platziert und sie wie gewohnt nach unten kopiert.Die Formeln bezogen sich auf den kopierten Bereich im zweiten Blatt.Es hat wunderbar funktioniert.

Ich bin nicht selbst auf die Idee gekommen – ich bin mir sicher, dass sie von jemandem im Google-Tabellenforum vorgeschlagen wurde.Ich sollte Ihnen einen Link zu dem Beitrag geben, aber ich habe ihn nur gesucht und kann ihn nicht finden.

Andere Tipps

In Ihrem Code haben Sie (Kommentare im 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();

Sie sollten diese Schleife einfach unterdrücken und nur die Blattnummer verwenden, mit der fortgefahren werden soll ...

Der einfachste Weg könnte sein, es so zu machen:

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

und am Ende der Schleife das } löschen, das zum gepasst hat for Schleife

BEARBEITEN :Der neue Code sollte so aussehen:

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]);
  }
//}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top