it-swarm.com.de

Wie kopiere ich eine Zeile von einer Google-Tabelle in eine andere Google-Tabelle mit einem Google Apps-Skript?

Hallo, ich wollte eine bestimmte Zeile mit Google Apps Script von einer Tabelle in eine andere kopieren. Kann mir jemand helfen, die Antwort dafür zu finden?.

13
Ani

Schauen Sie sich die Dokumentation hier an:

http://code.google.com/googleapps/appsscript/service_spreadsheet.html

Nehmen wir an, Sie arbeiten in der Tabelle, von der aus Sie kopieren.

Sie müssten einen Überblick über die aktuelle Tabelle und die Zieltabelle erhalten. Sie müssen die ID für die Zieltabelle erhalten. Details finden Sie im Link oben.

var ss = SpreadsheetApp.getActiveSpreadsheet();
var target = SpreadsheetApp.openById("abc1234567");

Als nächstes müssen wir die einzelnen Tabellen in diesen Tabellenkalkulationen auswählen. Nehmen wir an, Ihre Zeile befindet sich auf dem Arbeitsblatt mit dem Namen "New Stuff" und Sie haben ein Arbeitsblatt mit dem Namen "Archiv" in der Zieltabelle.

var source_sheet = ss.getSheetByName("New Stuff");
var target_sheet = target.getSheetByName("Archive");

Nun, das Konzept, das Google Apps Spreadsheets verwenden, sind Bereiche. Ein Bereich ist nur ein Stück Zellen. Wir müssen also den Bereich und den Bereich bestimmen. Nehmen wir an, Ihr Blatt hat 7 Spalten und Sie möchten die 10. Zeile.

var source_range = source_sheet.getRange("A10:G10");
var target_range = target_sheet.getRange("A1:G1");

Also nehmen wir diese Zeile in die erste Zeile des Zielblatts. Nun zum eigentlichen Exemplar:

source_range.copyTo(target_range);

Und du bist fertig!

Jetzt wird die erste Zeile des Zielblatts immer verdeckt. Sie können viel dagegen tun. Anstatt immer die erste Zeile zu verwenden, können Sie die Blattobjektmethoden verwenden, um die letzte Zeile zu suchen, eine Zeile danach hinzuzufügen und sie dann als Bereich zu verwenden.

var last_row = target_sheet.getLastRow();
target_sheet.insertRowAfter(last_row);
var target_range = target_sheet.getRange("A"+(last_row+1)+":G"+(last_row+1));

Auf diese Weise wird jedes Mal, wenn Sie eine Zeile kopieren, diese einfach am unteren Rand des Blattes hinzugefügt.

20
Keith Twombley

Die copyTo -Methode ist schlecht dokumentiert, da Sie den Inhalt nicht in eine Tabelle in einer anderen Tabelle kopieren können. 

Sie können die getValues ans setValues wie folgt verwenden:

function CopyDataToNewFile() {
  var sss = SpreadsheetApp.openById('0AjN7uZG....'); // sss = source spreadsheet
  var ss = sss.getSheetByName('Monthly'); // ss = source sheet
  //Get full range of data
  var SRange = ss.getDataRange();
  //get A1 notation identifying the range
  var A1Range = SRange.getA1Notation();
  //get the data values in range
  var SData = SRange.getValues();

  var tss = SpreadsheetApp.openById('8AjN7u....'); // tss = target spreadsheet
  var ts = tss.getSheetByName('RAWData'); // ts = target sheet
  //set the target range to the values of the source data
  ts.getRange(A1Range).setValues(SData);

}  
16
ubique

Ich bin auch darauf gestoßen. Es ist mir gelungen, eine Nice-Problemumgehung zu finden, bei der alles von einem Blatt auf ein anderes kopiert wird (mit Ausnahme von Bildern, Grafiken, Skripten und so). Es kopiert Formeln, Werte und formatiert sicher.

Grundsätzlich ist die Lösung zu 

  • kopieren Sie das Quellblatt als temporäres Quellblatt in die Ziel-Kalkulationstabelle
  • kopieren Sie die Daten vom temporären Quellblatt in das Zielblatt
  • entfernen Sie das temporäre Quellblatt

Code:

var sss = SpreadsheetApp.openById(spreadsheet); // sss = source spreadsheet
var ss = sss.getSheetByName(sheet); // ss = source sheet
var ss_temp = ss.copyTo(targetsheet);
var tss = SpreadsheetApp.openById(spreadsheet); // tss = target spreadsheet
var ts = tss.getSheetByName(sheet); // ts = target sheet
var range2Copy = ss_temp.getRange(range);
range2Copy.copyTo(ts.getRange(range));
bss.setActiveSheet(ss_temp);
bss.deleteActiveSheet()

Basierend auf den obigen Angaben habe ich eine Tabelle erstellt, die es mir ermöglicht, viele Kopien einer Master-Tabelle zu aktualisieren. Mit etwa 15 Kopien werden viele Copy-Paste-Aktionen gespeichert.

7

Vielleicht hilft Ihnen dieser Beitrag http://l.rw.rw/gscripts3 . Es beschreibt die Funktionalität der Kopierfunktion mit unterschiedlichen Bedingungen (Einschränken von Daten nach Bereich, benutzerdefinierte Filter, Platzieren von Daten mit Einfügungs- oder Ersetzungsmethoden). Und hat ein Beispiel, wo Sie es ausprobieren können.

1
Oleg Shaydenko

Eine andere Möglichkeit wäre, die Zeile (oder einen beliebigen Bereich) von der Quelle in die Zieltabelle zu importieren.

Angenommen, Sie möchten Zeile 3 aus dem Arbeitsblatt des Quell-Arbeitsblatts mit dem Namen "Quell-Arbeitsblatt-Blattname" importieren, und fügen Sie in der ersten Spalte des Zielverzeichnisses die folgende Formel ein: 

=IMPORTRANGE("source-spreadsheet-key","source-spreadsheet-sheet-name!3:3")

dabei ist "source-spreadsheet-key" die unque-ID der Quell-Kalkulationstabelle, die Sie aus ihrer URL extrahieren.

Wenn Sie es zum ersten Mal tun, wird die Sicherheitsmeldung angezeigt:

enter image description here

Einfach bestätigen und die ganze Zeile wird automatisch ausgefüllt.

Bitte denken Sie daran, dass es manchmal einige Minuten dauert, die importierten Zellen zu aktualisieren, nachdem Änderungen im Quellbereich vorgenommen wurden. Sie können den Vorgang jedoch beschleunigen, indem Sie ctrl-E oder ctrl-shift-E drücken, während Sie sich in der Zieltabelle befinden, je nachdem, was funktioniert.

1
ellockie

Verwenden Sie range.setValues, ist die beste Wahl. Funktioniert für jeden Bereich in einem beliebigen Blatt, sofern Ursprung und Zielbereich ähnlich sind.

Hier ist ein Beispielcode:

function openCSV() {

  //Buscamos el archivo
  var files = DriveApp.getFilesByName("ts.csv");

  //Cada nombre de archivo es unico, por eso next() lo devuelve.
  var file = files.next();

  fileID = file.getId();

  //Abrimos la spreadsheet, seleccionamos la hoja
  var spreadsheet = SpreadsheetApp.openById(fileID);
  var sheet = spreadsheet.getSheets()[0];

  //Seleccionamos el rango  
  var range = sheet.getRange("A1:F1");
  values = range.getValues();

  //Guardamos un log del rango
  //Logger.log(values);

  //Seleccionamos la hoja de destino, que es la activeSheet 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var SSsheet = ss.getSheets()[0];

  //Seleccionamos el mismo rango y le asignamos los valores
  var ssRange = SSsheet.getRange("A1:F1");
  ssRange.setValues(values);

}
0
Pulpo

Dies funktioniert nicht - es wird ein Fehler ausgegeben "Zielbereich und Quellbereich müssen sich in derselben Kalkulationstabelle befinden." Sieht so aus, als müssten wir etwas Ähnliches tun:

function copyRow_ (origSheetName, destSheetName, origRowNumber, destRowNumber)
{
  var origSheetObject = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(origSheetName);
  var destSheetObject = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(destSheetName);
  var origLastCol = origSheetObject.getLastColumn();
  var arrOrigData = origSheetObject.getRange(origRowNumber, 1, 1, origLastCol).getValues();
  var destlastRow = destSheetObject.getLastRow() + 1;
  if (destRowNumber)
    destlastRow = destRowNumber;
  var cont;
  for (cont = 0; cont < origLastCol; cont++)
       destSheetObject.getRange(destlastRow, 1+cont).setValue(arrOrigData[0][cont]);
}

(offensichtlich aus hier gestohlen)

0
Sean