2010-12-22 4 views

Antwort

21

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.

+8

Dies scheitert mit einer Fehlermeldung, die die beiden Bereiche in der gleichen Tabelle sein. – Josh

+0

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. –

+0

Sie sollten entweder Ihre Antwort entfernen oder korrigieren, um zu verhindern, dass Benutzer ihre Zeit verschwenden – Developer

0

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)

+1

Dies funktioniert für Werte, aber nicht für Formate. Stefan van Aalsts Lösung funktioniert für beide. – Josh

6

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.

10

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); 

} 
2

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.

1

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:

enter image description here

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.

0

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); 

}