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


}

Current Code Result

Trying to Get this Result

Pregunta hecha hace 3 años, 4 meses, 28 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);
    }
    

    Sheet.copyTo(Spreadsheet)

    range.copy(range)

    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étodo setNumberFormats() 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() y copyTo() 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étodo copyValuesToRange(). 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