Tengo una hoja maestra que maneja un montón de otras hojas de cálculo, en el sentido de que el maestro tiene un montón de importranges que extraen información específica de los elementos secundarios, los elementos secundarios son idénticos en función, pero no en datos. Cada una de las hojas de cálculo secundarias tiene sus propios scripts automatizados que pertenecen a cada ss individual, pero quiero que cualquier script que afecte a cada ss de manera equivalente se ejecute desde una hoja maestra. Todos los Child ss tienen una estructura idéntica, por lo que la primera hoja se llama main, que extrae un montón de datos de las otras hojas en ese mismo ss.

Básicamente, necesito ejecutar exactamente la misma función en aproximadamente 30 hojas de cálculo, y pensé que podría hacer 1 hoja de cálculo que tuviera un script que recorriera la lista de hojas de cálculo. Preferiblemente, la lista de identificadores de hoja de cálculo está en texto plano en un conjunto de celdas en la hoja de cálculo principal (Digamos Principal! B5: B), para que pueda agregar una nueva identificación de hoja de cálculo a la lista, y cualquier hoja de cálculo nueva que agregue también ejecutaría el script cuando lo ejecuto.

function myFunction() {
  // This next line is what I'm not sure how to do
    // var ssList = [ Cell B5, Cell B6 ...  ];
     var len = ssList.length 
     var rows = sheet.getDataRange();
     var numRows = rows.getNumRows();
     var values = rows.getValues();
     var rowsDeleted = 0;

  // Spreadsheet loop
     for (var i = 0; i < len; i++) {
         var TargetSheet = SpreadsheetApp.openById(ssList[i]);
     }
}
0
Chris McMahon 24 jun. 2020 a las 18:19

2 respuestas

La mejor respuesta

Esto debería funcionar y parece estar en el camino correcto, pero debe hacer referencia a la columna específica en cada fila que contiene la ID.

GetValues () devuelve una matriz bidimensional ("matriz de matrices"), cada fila es una matriz de celdas. En este momento está pasando toda la fila a openById, en lugar de una celda específica.

No necesita codificar la lista de celdas que contienen ID en su secuencia de comandos, en su lugar, solo debe confiar en los datos que se encuentran en su hoja de cálculo.

Por ejemplo, si las ID de la hoja de cálculo están en la Columna A, debe hacer referencia al valor en el índice 0 de la fila:

var TargetSheet = SpreadsheetApp.openById(values[i][0]);

O si los ID de la hoja de cálculo están en la Columna B, ese sería el índice 1 de la fila:

var TargetSheet = SpreadsheetApp.openById(values[i][1]);

Para obtener el valor de "len", puede referirse a la longitud de los valores, el número total de filas en el rango de datos.

var len = values.length;

El código completamente modificado se vería así:

function myFunction() {
     var rows = sheet.getDataRange();
     var values = rows.getValues();
     var rowsDeleted = 0;

  // Spreadsheet loop
     for (var i = 0; i < values.length; i++) {
         var TargetSheet = SpreadsheetApp.openById(values[i][1]);  //get all values from column "B" (index 1)
     }
}
1
Cameron Roberts 24 jun. 2020 a las 18:41
function myFunctionxx() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('Main');
  const rg=sh.getRange(5,2,sh.getLastRow()-4,1);
  var list=rg.getValues().map(function(r){return r[0];});
  list.forEach(function(ssid){
    myOtherfunction(ssid);
  });
} 
0
Cooper 24 jun. 2020 a las 18:02