2010-12-22 74 views

Respuesta

21

Mira la documentación aquí:

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

Supongamos que está trabajando en la hoja de cálculo donde se está grabando de.

Tendría que obtener un control de la hoja de cálculo actual y la hoja de cálculo de destino. Deberá obtener la identificación para la hoja de cálculo de destino. Los detalles están en el enlace allí arriba.

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

A continuación tenemos que elegir las hojas específicas dentro de esas hojas de cálculo. Supongamos que su fila está en la hoja llamada "Cosas nuevas" y tiene una hoja en la hoja de cálculo de destino denominada "Archivo".

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

Ahora, el concepto que usan las hojas de cálculo de Google Apps son los rangos. Un rango es solo un trozo de celdas. Entonces, necesitamos determinar el rango y el rango. Digamos que su hoja tiene 7 columnas y desea la 10ma fila.

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

Así que vamos a tomar esa fila y ponerla en la primera fila de la hoja de destino. Ahora para la copia real:

source_range.copyTo(target_range); 

¡Y listo!

Ahora, esto siempre golpeará la primera fila de la hoja de destino. Hay mucho que puedes hacer para detener eso. En lugar de usar siempre la primera línea, puede usar los métodos del objeto hoja para encontrar la última fila, agregar una después y luego usarla como su rango.

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

De esa manera cada vez que se copia una fila más, sólo se agrega a la parte inferior de la hoja.

+8

Esta falla con un mensaje de error que las dos cadenas tienen que estar en la misma hoja de cálculo. – Josh

+0

Lo siento, @Josh. Pueden haber cambiado cómo funciona copyTo() después de que escribí esa respuesta (estoy bastante seguro de que lo probé y copié las líneas js directamente de mi documento de prueba). Una de las otras respuestas probablemente funcionará mejor. Sin realmente * intentar * ninguno de ellos, mi apuesta es que [la respuesta de ubique] (http://stackoverflow.com/a/11676703/23866) funcionará. –

+0

Debe eliminar o corregir su respuesta para evitar que los usuarios pierdan su tiempo – Developer

0

Esto no funciona - devuelve un error "El rango de destino y el rango de origen deben estar en la misma hoja de cálculo". Parece que tenemos que hacer algo similar a esto:

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

(robado descaradamente de here)

+1

Esto funciona para valores pero no para formatos. La solución de Stefan van Aalsts funciona para ambos. – Josh

6

me encontré con esto también. Me las arreglé para encontrar una buena solución que copia todo de una hoja a otra (a excepción de imágenes, gráficos, scripts y demás). Copia fórmulas, valores, formateo seguro.

Básicamente la solución es

  • copia la hoja de origen a la hoja de cálculo de destino como una hoja fuente temp
  • copiar los datos de la hoja de fuente temp a la hoja de destino
  • eliminar la fuente temp hoja de

Código:

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

Basado en lo anterior, creé una hoja de cálculo que me permite actualizar muchas copias de una hoja de cálculo maestra. Con alrededor de 15 copias, ahorra una gran cantidad de acciones de copiar y pegar.

10

el método copyTo está poco documentado porque no le permite copiar el contenido de una hoja en una hoja de otra hoja de cálculo. Usted tendrá que usar los setValues ​​GetValues ​​ans, como a continuación:

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

Tal vez este post http://l.rw.rw/gscripts3 ayuda. Describe la funcionalidad de la función de copia con diferentes condiciones (límites de datos por rango, filtros personalizados, datos de lugares para orientar con métodos de inserción o reemplazo). Y tiene un ejemplo de trabajo donde puedes probarlo.

1

Otra forma de hacerlo sería importar la fila (o cualquier rango) de la fuente en la hoja de cálculo de destino.

Suponiendo que desea importar la fila 3 de la hoja de hoja de cálculo fuente llamada "fuente de hojas de cálculo hojas-name", puesto en la primera columna de la ubicación de destino de la siguiente fórmula:

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

donde "source-spreadsheet-key" es el ID único de la hoja de cálculo fuente que extrae de su URL.

Si lo hace por primera vez, aparecerá el mensaje de seguridad:

enter image description here

Sólo confirmar y toda la fila será rellenado automáticamente.

Recuerde que a veces lleva un par de minutos actualizar las celdas importadas después de realizar cambios en el área de origen. Sin embargo, puede acelerarlo presionando ctrl-E, o ctrl-shift-E, mientras está en la hoja de cálculo de destino, lo que funcione.

0

Usar range.setValues, es la mejor opción. Funciona para cualquier rango en cualquier hoja, en la medida en que el rango de origen y destino sea similar.

Aquí está un ejemplo de código:

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

} 
Cuestiones relacionadas