supongamos que tenemos una tabla de 4 x 4 a partir de A1, ahora normalmente, si quiero actualizar sus valores de una vez, lo haré
sheet.getRange("A1:D4").setValues(values);ahora, si los datos no son contiguos, entonces tengo 3 4 x 4 tablas separadas con otros datos entre ellas, pero las tengo nombradas como rangos, es decir (tabla1, tabla2, tabla3), ¿puedo hacer algo como:
sheet.getNamedRanges([table1range, table2range, table3range]).setValues([table1data, table2data, table3data]);en vez de:
sheet.getRange(table1range).setValues(table1data); sheet.getRange(table2range).setValues(table2data); sheet.getRange(table3range).setValues(table3data);¿Entonces ahora las 3 tablas se actualizarán en la misma operación en lugar de 3 operaciones diferentes para ahorrar tiempo de ejecución? gracias de antemano.
De acuerdo con la propuesta de Tanaike, sugiero una ligera modificación.
const ss = SpreadsheetApp.getActiveSpreadsheet() const sheet = ss.getActiveSheet() const ranges = [table1range2D, table2range2D, table3range2D]; const values = [data1values2D, data2values2D, data3values2D]; const data = ranges.map((e, i) => ({ range: `'${sheet.getName()}'!${e}`, values : values[i] })); Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, ss.getId());por ejemplo
function updateGoogleSheet() { const ss = SpreadsheetApp.getActiveSpreadsheet() const sheet = ss.getActiveSheet() const otherSheet = ss.getSheetByName('other') const table1range2D = 'A1:B2', table2range2D = 'C4:D5', table3range2D = 'E7:F8' const data1values2D = otherSheet.getRange('A1:B2').getValues(), data2values2D = otherSheet.getRange('C4:D5').getValues(), data3values2D = otherSheet.getRange('E7:F8').getValues() const ranges = [table1range2D, table2range2D, table3range2D]; const values = [data1values2D, data2values2D, data3values2D]; const data = ranges.map((e, i) => ({ range: `'${sheet.getName()}'!${e}`, values : values[i] })); Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, ss.getId()); } donde en la hoja llamada 'otro' podemos encontrar en A1 =sequence(10,10,0,1)
Creo que su objetivo es el siguiente.
sheet.getNamedRanges([table1range, table2range, table3range]).setValues([table1data, table2data, table3data]); con el fin de reducir el costo del proceso.En este caso, creo que Sheets API se puede usar para lograr su objetivo de la siguiente manera. En este caso, este hilo podría ser útil. Ref. Cuando se usa Sheets API para su situación, el costo del proceso se puede reducir en lugar del método para colocar los valores en cada rango en el bucle mediante el servicio de hoja de cálculo (SpreadsheetApp). Árbitro
const spreadsheetId = "###"; // Please set the Spreadsheet ID. const ranges = [table1range, table2range, table3range]; // Please set table1range, table2range, table3range as A1Notation. const values = [table1data, table2data, table3data]; // Please set table1data, table2data, table3data. const data = ranges.map((e, i) => ({range: e, values: [[values[i]]]})); Sheets.Spreadsheets.Values.batchUpdate({data, valueInputOption: "USER_ENTERED"}, spreadsheetId);Pero, en este caso, pensé que podría ser un poco difícil crear el cuerpo de la solicitud. Así que creé una biblioteca de Google Apps Script como contenedor para usar la API de hojas. Cuando se utiliza esta biblioteca, el script de ejemplo es el siguiente.
Puede ver el método para instalar la biblioteca aquí . Y, este script usa Sheets API. Por lo tanto , habilite Sheets API en los servicios avanzados de Google .
const ranges = [table1range, table2range, table3range]; // Please set table1range, table2range, table3range as A1Notation. const values = [table1data, table2data, table3data]; // Please set table1data, table2data, table3data. const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); RangeListApp.getSpreadsheet(spreadsheet).getRangeList(ranges).setValues(values);values se coloca en cada rango de ranges mediante Sheets API.