Exportación de datos de una hoja de cálculo de Google a otra usando Google Apps Script
Tengo dos hojas de cálculo diferentes de Google con dos hojas diferentes (Spreadsheet_Source y Spreadsheet_Target). Estoy buscando copiar un Range("B3:AE55") de Spreadsheet_Source a Range("B3:AE55") en Spreadsheet_Target. Usé un bucle para conseguir la mayoría del formato, sin embargo, el código toma un minuto para ejecutar.
¿Hay una manera más fácil de copiar los datos Y su formato de Spreadsheet_ Fuente de Spreadsheet_Target Sin usando la función copyTo()?
Código Script de aplicaciones actuales:
function exportOrderData() {
var sourceSpreadsheetID = "";
var sourceWorksheetName = "AddOrders";
var targetSpreadsheetID = "";
var targetWorksheetName = "CopyToTest";
// The "AddOrders" Child Sheet from the "SignDreamersInventory" Parent Sheet
var sourceSpreadsheet = SpreadsheetApp.openById(sourceSpreadsheetID);
var sourceWorksheet = sourceSpreadsheet.getSheetByName(sourceWorksheetName);
var sourceData = sourceWorksheet.getRange("B3:D55").activate(); // Gets Order #1 Data
// The "CopyToTest" Child Sheet from the "CopyToTest" Parent Sheet
var toSpreadsheet = SpreadsheetApp.openById(targetSpreadsheetID);
var targetWorksheet = toSpreadsheet.getSheetByName(targetWorksheetName);
var targetRange = targetWorksheet.getRange(1, 1, sourceData.getNumRows(), sourceData.getNumColumns());
var rowStart = 3;
var columnStart = 2;
var backgroundColor = "";
var kitSelectRowStarts = 9;
var kitSelectRowEnds = 10;
sourceNumberOfColumns = 30; // 30 Columns holding the Order Information
sourceNumberOfRows = 52; // 55 Rows holding the Order Information
for(var i = 0; i <= 30; i++){
for(var j = 0; j <= 52; j++){
backgroundColor = sourceWorksheet.getRange(rowStart + i, columnStart + j).getBackground();
formula = sourceWorksheet.getRange(rowStart + i, columnStart + j).getFormula();
text = sourceWorksheet.getRange(rowStart + i, columnStart + j).getValue();
fontWeight = sourceWorksheet.getRange(rowStart + i, columnStart + j).getFontWeight();
fontSize = sourceWorksheet.getRange(rowStart + i, columnStart + j).getFontSize();
fontColor = sourceWorksheet.getRange(rowStart + i, columnStart + j).getFontColor();
textHorAlignment = sourceWorksheet.getRange(rowStart + i, columnStart + j).getHorizontalAlignment();
textVerAlignment = sourceWorksheet.getRange(rowStart + i, columnStart + j).getVerticalAlignment();
//Logger.log(wrap[0][0]);
// Override and set background, font weight, wrap, etc.
// targetWorksheet.getRange(rowStart + i, columnStart + j).setBackground(backgroundColor)
// WRAP only the Kit Rows
if(i == 6 || i == 7){
targetWorksheet.getRange(rowStart + i, columnStart + j).setWrapStrategy(SpreadsheetApp.WrapStrategy.WRAP);
}
else{
targetWorksheet.getRange(rowStart + i, columnStart + j).setWrapStrategy(SpreadsheetApp.WrapStrategy.CLIP);
}
targetWorksheet.getRange(rowStart + i, columnStart + j)
.setValue(text)
.setFontWeight(fontWeight)
.setFontSize(fontSize)
.setFontColor(fontColor)
.setHorizontalAlignment(textHorAlignment)
.setVerticalAlignment(textVerAlignment);
}
}
}
Pregunta hecha hace 3 años, 5 meses, 5 días - Por logiclinguist
3 Respuestas:
-
Prueba esto:
function exportOrderData() { const sss=SpreadsheetApp.openById("ssid");//src const ssh=sss.getSheetByName("AddOrders"); const tss=SpreadsheetApp.openById('ssid');//tgt const tsh=tss.getSheetByName("CopyToTest") const nsh=ssh.copyTo(tss); nsh.getRange("B3:D55").copyTo(tsh.getRange("A1")); tss.deleteSheet(nsh); }
Respondida el Dec 18, 2020 a las 06:02 - por codesculptor
Votos positivos: 0 | Votos negativos: 0 -
El código que estás utilizando actualmente para copiar los datos y el formato de una hoja de cálculo a otra mediante Google Apps Script es bastante extenso y puede tardar en ejecutarse debido al bucle anidado que recorre todas las celdas del rango especificado.
Una forma más eficiente de lograr esto es usar el método
setValues()
para copiar los valores directamente y el métodosetNumberFormats()
para copiar los formatos de celda. De esta manera, se realiza una sola operación para copiar los datos y formatos en lugar de operar celda por celda en un bucle.Aquí te dejo un ejemplo de cómo podrías modificar tu función
exportOrderData()
para lograr esto:javascript function exportOrderData() { var sourceSpreadsheetID = ""; var sourceWorksheetName = "AddOrders"; var targetSpreadsheetID = ""; var targetWorksheetName = "CopyToTest"; var sourceSpreadsheet = SpreadsheetApp.openById(sourceSpreadsheetID); var sourceWorksheet = sourceSpreadsheet.getSheetByName(sourceWorksheetName); var sourceData = sourceWorksheet.getRange("B3:AE55").getValues(); // Obtener solo valores var toSpreadsheet = SpreadsheetApp.openById(targetSpreadsheetID); var targetWorksheet = toSpreadsheet.getSheetByName(targetWorksheetName); var targetRange = targetWorksheet.getRange(3, 2, 52, 30); // Rango en la hoja de destino // Copiar valores y formatos directamente targetRange.setValues(sourceData); sourceWorksheet.getRange("B3:AE55").copyTo(targetRange, {formatOnly:true}); }
Con este código, primero se obtienen solo los valores de la hoja de origen en un array multidimensional, luego se establece un rango en la hoja de destino y se utilizan los métodos
setValues()
ycopyTo()
para copiar los valores y formatos respectivamente.Esta forma debería ser más eficiente y reducir el tiempo de ejecución de tu script. Asegúrate de ajustar los rangos y las coordenadas de acuerdo a tus necesidades específicas. Espero que esta información te sea útil. ¡Déjame saber si tienes alguna otra pregunta!
Respondida el Dec 19, 2020 a las 06:03 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Solución 1:
Para copiar rápidamente los datos y el formato sin usar
copyTo()
, puedes usar el métodocopyValuesToRange()
. Este método copia tanto los valores como el formato de un rango a otro.Código actualizado:
javascript function exportOrderData() { var sourceSpreadsheetID = ""; var sourceWorksheetName = "AddOrders"; var targetSpreadsheetID = ""; var targetWorksheetName = "CopyToTest"; // The "AddOrders" Child Sheet from the "SignDreamersInventory" Parent Sheet var sourceSpreadsheet = SpreadsheetApp.openById(sourceSpreadsheetID); var sourceWorksheet = sourceSpreadsheet.getSheetByName(sourceWorksheetName); var sourceData = sourceWorksheet.getRange("B3:AE55"); // Obtener el rango completo de datos // The "CopyToTest" Child Sheet from the "CopyToTest" Parent Sheet var toSpreadsheet = SpreadsheetApp.openById(targetSpreadsheetID); var targetWorksheet = toSpreadsheet.getSheetByName(targetWorksheetName); var targetRange = targetWorksheet.getRange("B3:AE55"); // Obtener el rango de destino sourceData.copyTo(targetRange, {contentsOnly: false}); // Copiar valores y formato // Opcional: Establecer formato adicional específico para columnas si es necesario }
Solución 2:
Si necesitas aplicar formato personalizado adicional después de copiar, puedes usar el método
setNumberFormats()
. Este método te permite establecer formatos de número específicos para las celdas.Código actualizado:
javascript function exportOrderData() { var sourceSpreadsheetID = ""; var sourceWorksheetName = "AddOrders"; var targetSpreadsheetID = ""; var targetWorksheetName = "CopyToTest"; // The "AddOrders" Child Sheet from the "SignDreamersInventory" Parent Sheet var sourceSpreadsheet = SpreadsheetApp.openById(sourceSpreadsheetID); var sourceWorksheet = sourceSpreadsheet.getSheetByName(sourceWorksheetName); var sourceData = sourceWorksheet.getRange("B3:AE55"); // Obtener el rango completo de datos // The "CopyToTest" Child Sheet from the "CopyToTest" Parent Sheet var toSpreadsheet = SpreadsheetApp.openById(targetSpreadsheetID); var targetWorksheet = toSpreadsheet.getSheetByName(targetWorksheetName); var targetRange = targetWorksheet.getRange("B3:AE55"); // Obtener el rango de destino sourceData.copyTo(targetRange, {contentsOnly: false}); // Copiar valores y formato // Establecer formato de número personalizado para columnas específicas targetWorksheet.getRange("B3:B55").setNumberFormat("$
,##0;-$#,##0"); // Formato de moneda para la columna B targetWorksheet.getRange("E3:AE55").setNumberFormat("0;0"); // Formato de número entero para las columnas E a AE }Beneficios de usar estos métodos:
Más rápido que usar un bucle para copiar el formato individualmente. Mantiene el formato original de los datos. * Permite aplicar formato personalizado adicional después de copiar.
Respondida el Dec 19, 2020 a las 06:05 - por Gemini
Votos positivos: 0 | Votos negativos: 0