Hallo Ich wollte eine bestimmte Zeile aus einer Tabelle in eine andere Tabelle mit Google Apps-Skript kopieren.Kann mir bitte helfen, die Antwort dafür zu bekommen.Wie kopiert man eine Zeile von einer Google-Tabelle in eine andere Google-Tabelle mit Google Apps-Skript?
Antwort
Schauen Sie sich die Dokumentation hier:
http://code.google.com/googleapps/appsscript/service_spreadsheet.html
Nehmen wir an, Sie in der Tabelle arbeiten, wo Sie kopieren sind.
Sie müssten ein Handle für die aktuelle Tabelle und die Zieltabelle erstellen. Sie müssen die ID für die Zieltabelle abrufen. Details sind im Link dort oben.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var target = SpreadsheetApp.openById("abc1234567");
Als nächstes müssen wir die einzelnen Blätter in diesen Tabellen auswählen. Nehmen wir an, Ihre Zeile befindet sich auf dem Blatt mit dem Namen "New Stuff", und Sie haben ein Blatt in der Zieltabelle namens "Archive".
var source_sheet = ss.getSheetByName("New Stuff");
var target_sheet = target.getSheetByName("Archive");
nun das Konzept, dass Google Apps-Tabellen verwenden, sind Bereiche. Eine Reihe ist nur ein Stück Zellen. Also müssen wir den Aus-Bereich und den Aus-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 und legen sie in die erste Zeile des Zielblattes. Jetzt für die tatsächliche Kopie:
source_range.copyTo(target_range);
Und du bist fertig!
Nun wird dies immer die erste Zeile des Zielblatts verdecken. Es gibt viel, was Sie tun können, um das zu stoppen. Anstatt immer die erste Zeile zu verwenden, können Sie die Methode blechobjekt verwenden, um die letzte Zeile zu suchen, eine nach der anderen hinzuzufügen und sie dann als Bereich zu verwenden.
Auf diese Weise wird jedes Mal, wenn Sie eine Zeile kopieren, diese nur am unteren Rand des Blattes hinzugefügt.
Dies funktioniert nicht - gibt einen Fehler zurück "Zielbereich und Quellbereich müssen sich in derselben Tabelle befinden." Sieht aus wie wir dies etwas Ähnliches tun müssen:
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]);
}
(eklatant von here gestohlen)
Dies funktioniert für Werte, aber nicht für Formate. Stefan van Aalsts Lösung funktioniert für beide. – Josh
ich in dem so gut lief. Es ist mir gelungen, eine nette Problemumgehung zu finden, die alles von einem Blatt in ein anderes kopiert (außer Bilder, Grafiken, Skripte und so). Es kopiert Formeln, Werte, Formatierung sicher.
Grundsätzlich ist die Lösung zu
- Kopie der Quellbogen an das Ziel Tabelle als eine temporäre Quellbogen
- die Daten aus dem temporären Quellbogen auf das Zielblatt kopieren
- die temp Quelle entfernen Blatt
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 dem oben genannten erstellt ich eine Tabelle, die es mir ermöglicht, viele Kopien von einem Master-Arbeitsblatt zu aktualisieren. Mit etwa 15 Kopien werden viele Kopier- und Einfügeaktionen gespeichert.
Die Methode copyTo ist schlecht dokumentiert, da Sie nicht Inhalte von einem Blatt in ein Blatt in einem anderen Arbeitsblatt kopieren können. Sie werden die GetValues ans SetValues wie unten verwenden möchten:
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);
}
Vielleicht Beitrag, den Sie hilft http://l.rw.rw/gscripts3. Es beschreibt die Funktionalität der Kopierfunktion mit verschiedenen Bedingungen (Daten nach Bereich begrenzen, benutzerdefinierte Filter, Daten mit Methoden zum Einfügen oder Ersetzen an Ziel festlegen). Und hat funktionierendes Beispiel, wo Sie es versuchen können.
Eine andere Möglichkeit wäre, die Zeile (oder einen Bereich) von der Quelle in die Zieltabelle zu importieren.
Unter der Annahme, dass Sie Reihe möchten 3 von der Quelle Tabelle des Blattes importieren als „Quelle-Arbeitsblatt-sheet-name“, legte in der ersten Spalte des Zielortes die folgende Formel:
=IMPORTRANGE("source-spreadsheet-key","source-spreadsheet-sheet-name!3:3")
wo "source-spreadsheet-key"
ist die eindeutige ID der Quell-Tabelle, die Sie aus ihrer URL extrahieren.
Wenn Sie es erstmals tun, wird die Sicherheitsmeldung angezeigt:
nur bestätigen und die ganze Zeile wird automatisch ausgefüllt werden.
Bitte beachten Sie, dass es manchmal einige Minuten dauert, die importierten Zellen zu aktualisieren, nachdem Änderungen im Quellbereich vorgenommen wurden. Sie können es jedoch beschleunigen, indem Sie ctrl-E oder ctrl-shift-E drücken, während Sie in der Zieltabelle arbeiten, je nachdem, was funktioniert.
Verwenden Sie range.setValues, ist die beste Wahl. Funktioniert für jeden Bereich in jedem Blatt, soweit der Ursprung und der 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);
}
Dies scheitert mit einer Fehlermeldung, die die beiden Bereiche in der gleichen Tabelle sein. – Josh
Tut mir leid, @Josh. Sie haben möglicherweise geändert, wie copyTo() funktioniert, nachdem ich diese Antwort geschrieben habe (ich bin ziemlich sicher, dass ich es getestet habe und die js Zeilen direkt aus meinem Testdokument kopiert habe). Eine der anderen Antworten wird wahrscheinlich besser funktionieren. Ohne wirklich irgendeinen von ihnen zu versuchen, ist meine Wette, dass [ubiques Antwort] (http://stackoverflow.com/a/11676703/23866) funktionieren wird. –
Sie sollten entweder Ihre Antwort entfernen oder korrigieren, um zu verhindern, dass Benutzer ihre Zeit verschwenden – Developer