Tengo una lista maestra con docenas de nombres en la fila 2 repartidos en varias columnas (A2:Z2). Debajo de cada nombre hay una lista de valores y datos.
| fila 2 | John | Salida | Jaime |
|---|---|---|---|
| fila 3 | Valor | Valor | Valor |
| fila 4 | Valor | Valor | Valor |
| fila 5 | Valor | Valor | |
| fila 6 | Valor | Valor |
Cada nombre debe crearse en una hoja.
Aquí está la secuencia de comandos utilizada para crear una hoja para cada nombre en la fila 2:
function generateSheetByName() { const ss = SpreadsheetApp.getActive(); var mainSheet = ss.getSheetByName('Master List'); const sheetNames = mainSheet.getRange(2, 1, mainSheet.getLastRow(), 1).getValues().flat(); sheetNames.forEach(n => ss.insertSheet(n)); }Quiero que este script no solo cree una hoja para cada nombre, sino que también transfiera todos los valores debajo de cada nombre hasta la última fila de la columna respectiva.
por ejemplo, John está en A2 y A3:A son los valores que deben trasladarse a la hoja creada. Sally es B2 y B3:B son los valores que deben transferirse.
En la hoja de John: "John" es el encabezado en A1 y los valores de la columna se encuentran en A2:A
Para cada hoja que se crea, también quiero agregar otros valores manualmente. Como por ejemplo, si se crea la hoja "John" y se agregan 20 valores en A2:A22, quiero que el script agregue una casilla de verificación en B2:B22. O agregar siempre una fórmula en B1 como "=counta(a2:a)" o algo así.
¿Cómo puedo hacer esto con un bucle eficiente? Tenga en cuenta que esto probablemente creará 50 hojas y transferirá entre 10 y 50 valores por hoja
Imágenes de ejemplo:
Lista maestra:
Cada nombre tendrá una hoja creada que se verá así
hoja de juan
Creo que su objetivo es el siguiente.
En este caso, ¿qué tal el siguiente script de muestra?
En esta secuencia de comandos de muestra, para reducir el costo del proceso de la secuencia de comandos, utilicé Sheets API. Cuando se utiliza Sheets API, el costo del proceso podrá reducirse un poco. Entonces, antes de usar este script, habilite Sheets API en los servicios avanzados de Google .
function generateSheetByName() { // 1. Retrieve values from "Master List" sheet. const ss = SpreadsheetApp.getActive(); const mainSheet = ss.getSheetByName('Master List'); const values = mainSheet.getRange(2, 1, mainSheet.getLastRow(), mainSheet.getLastColumn()).getValues(); // 2. Transpose the values without the empty cells. const t = values[0].map((_, c) => values.reduce((a, r) => { if (r[c]) a.push(r[c]); return a; }, [])); // 3. Create a request body for using Sheets API. const requests = t.flatMap((v, i) => { const sheetId = 123456 + i; const ar = [{ addSheet: { properties: { sheetId, title: v[0] } } }]; const temp = { updateCells: { range: { sheetId, startRowIndex: 0, startColumnIndex: 0 }, fields: "userEnteredValue,dataValidation" }, }; temp.updateCells.rows = v.map((e, j) => { if (j == 0) { return { values: [{ userEnteredValue: { stringValue: e } }, { userEnteredValue: { formulaValue: "=counta(a2:a)" } }] } } const obj = typeof (e) == "string" || e instanceof String ? { stringValue: e } : { numberValue: e } return { values: [{ userEnteredValue: obj }, { dataValidation: { condition: { type: "BOOLEAN" } } }] } }); return ar.concat(temp); }); // 4. Request to the Sheets API using the created request body. Sheets.Spreadsheets.batchUpdate({requests}, ss.getId()); }