Copiar un rango y pegar valores en todas las sub hojas, tenemos el código para una hoja

Tenemos un script de google que está funcionando bien para una sub hoja (Nombre de la hoja sub - Candy), pero cómo podemos ejecutarlo para toda otra sub hoja, Otro Nombre de la hoja sub es Leno, Sam, Gnito, Param, Ning

En All Sub Sheet Cell en Cell D37 hemos puesto un filtro a través del cual estamos obteniendo el valor en Cell D37:M41, ahora queremos convertirlo en "Formula to Value"

Código

function CopyValue() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Candy'), true);
  spreadsheet.getRange('D37').activate();
  spreadsheet.getRange('D37:M41').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.getRange('D37:M41').activate();
  spreadsheet.getActiveRangeList().setFontSize(10)
  .setFontFamily(null)
  .clearFormat()
  .setHorizontalAlignment('center')
  .setVerticalAlignment('middle');
  spreadsheet.getRange('D37:D41').activate();
  spreadsheet.getRange('D37').activate();
}

Pregunta hecha hace 3 años, 4 meses, 27 días - Por javajedi


3 Respuestas:

  • Usar un for lazo o forEach

    A continuación mostro su código adaptado con forEach

    // This function copies and pastes the ranges.
    function copyRanges(sheet) {
      // Copy pasting your code here:
      sheet.getRange("D37").activate();
      sheet
        .getRange("D37:M41")
        .copyTo(
          sheet.getActiveRange(),
          SpreadsheetApp.CopyPasteType.PASTE_VALUES,
          false
        );
      sheet.getRange("D37:M41").activate();
      sheet
        .getActiveRangeList()
        .clearFormat()
        .setHorizontalAlignment("center")
        .setVerticalAlignment("middle");
    }
    
    // This function selects the sheets.
    function updateSheets(sheetArray = null) {
      var spreadsheet = SpreadsheetApp.getActive();
      let sheets = spreadsheet.getSheets();
    
      if (sheetArray != null) {
        sheets = sheets.filter((sheet) => {
          let name = sheet.getName();
          return sheetArray.includes(name);
        });
      }
    
      sheets.forEach((sheet) => {
        updateSheet(sheet);
      });
    }
    
    // RUN THIS FUNCTION
    function main() {
      let sheetArray = ["Leno", "Gnito", "Ning"]; // Update with sheets you want to update.
      updateSheets(sheetArray);
    
      // To update all sheets call this instead
      // updateSheets();
    }
    

    Limpié lo que me pareció algo redundante de tu código.

    Una sugerencia es que deje de utilizar rangos activos, copiar y pegar operaciones y empezar a utilizar getValue getValues y setValue setValues. Son mucho más rápidos, más robustos y flexibles.

    Referencias

    Respondida el Dec 18, 2020 a las 11:16 - por bytebison

    Votos positivos: 0 | Votos negativos: 0

  • Para ejecutar el mismo código en todas las sub hojas, puedes modificar tu función para que sea más genérica y recorra todas las hojas según sus nombres. Aquí te muestro cómo podrías modificar tu código para lograrlo:

    javascript
    function CopyValue() {
      var spreadsheet = SpreadsheetApp.getActive();
      var subSheets = ['Candy', 'Leno', 'Sam', 'Gnito', 'Param', 'Ning'];
    
      subSheets.forEach(function(sheetName) {
        var sheet = spreadsheet.getSheetByName(sheetName);
        if (sheet) {
          sheet.activate();
          spreadsheet.getRange('D37').activate();
          spreadsheet.getRange('D37:M41').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
          spreadsheet.getRange('D37:M41').activate();
          spreadsheet.getActiveRangeList().setFontSize(10)
          .setFontFamily(null)
          .clearFormat()
          .setHorizontalAlignment('center')
          .setVerticalAlignment('middle');
          spreadsheet.getRange('D37:D41').activate();
          spreadsheet.getRange('D37').activate();
        } else {
          Logger.log("Hoja no encontrada: " + sheetName);
        }
      });
    }
    

    Con esta modificación, la función CopyValue() recorrerá todas las hojas especificadas en el array subSheets y ejecutará el mismo proceso en cada una de ellas. Si una hoja no es encontrada, se mostrará un mensaje en el registro para que puedas identificarla.

    Ahora podrás ejecutar este código para todas las sub hojas especificadas.

    Respondida el Dec 19, 2020 a las 11:18 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para ejecutar el script en todas las sub hojas, puedes utilizar un bucle for para iterar sobre todas las sub hojas y ejecutar el script en cada una de ellas. Aquí tienes un ejemplo de cómo puedes hacerlo:

    
    function CopyValueAllSubSheets() {
      // Obtener la hoja de cálculo activa.
      var spreadsheet = SpreadsheetApp.getActive();
    
      // Obtener todas las sub hojas.
      var subSheets = spreadsheet.getSheets();
    
      // Iterar sobre todas las sub hojas.
      for (var i = 0; i < subSheets.length; i++) {
        var subSheet = subSheets[i];
    
        // Establecer la sub hoja activa.
        spreadsheet.setActiveSheet(subSheet, true);
    
        // Ejecutar el script de copia de valores en la sub hoja activa.
        CopyValue();
      }
    }
    

    Este script iterará sobre todas las sub hojas de la hoja de cálculo activa y ejecutará la función CopyValue() en cada una de ellas. De este modo, se convertirán los valores en el rango D37:M41 de todas las sub hojas en valores de fórmula.

    Ten en cuenta que debes asegurarte de que la función CopyValue() está definida en el mismo script que la función CopyValueAllSubSheets().

    Respondida el Dec 19, 2020 a las 11:24 - por Gemini

    Votos positivos: 0 | Votos negativos: 0