Tengo esta lista de rangos como destino y una fila de valores que deben escribirse en el destino. Estaba pensando en iterar a través de la fila de datos y también a través de la lista de rangos y establecer el valor en el camino, pero no puedo encontrar una manera de iterar a través de los elementos en la fila de datos. Aquí está la pieza de código en la que estoy trabajando:
function moveItem() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getActiveSheet(); const values = sheet.getRange("A6:D9").getValues(); let data = []; const ref = sheet.getRange('A13').getValue(); const variation = sheet.getRange('C13').getValue(); for (let i = 0; i < values.length; i++) { if (values[i][0] == ref && values[i][4] == variation) { data.push(values[i]) } } const destRng = [ "B17", "B18", "D17", "D18" ] const rngList = sheet.getRangeList(destRng).getRanges(); for (let n = 0; n < data.length; n++) { rngList[n].setValue(data[n]) } }He aquí un ejemplo práctico: https://docs.google.com/spreadsheets/d/1IKr-faDQOk7VBpiTVnxUEMllXbe0ON9-gKwfJii3G0U/edit?usp=sharing
getValues() obtiene 01 fila de datos. Cada columna de esta fila debe ir al destRng a medida que recorremos estas columnas y los rangos de destino.
Ahora, esto es obtener el primer elemento de datos y escribirlo en todas las celdas de destino. ¿Cómo puedo revisar estos elementos de datos?
¡Gracias!
A partir de su información adicional, no puedo entender la lógica cuando "A13" y "C13" son "Texto1" y "Texto1C", "B17:B18" y "D17:D18" son Text1, Text1B y Text1C, Text1D , respectivamente. Pensé que en su hoja de cálculo de muestra, la "Variación" de "C12" podría ser de la columna "B". Cuando mi comprensión es correcta, ¿qué tal la siguiente modificación?
for (let i = 0; i < values.length; i++) { if (values[i][0] == ref && values[i][4] == variation) { data.push(values[i]) } } for (let i = 0; i < values.length; i++) { if (values[i][0] == ref && values[i][1] == variation) { // Modified data.push(values[i]) } } if (data.length == 0) return; // Added data = data[0]; // AddedText1, Text1B y Text1C, Text1D , respectivamente.En esta modificación, utilicé su hoja de cálculo de muestra y su secuencia de comandos. Cuando su situación real es diferente de la que muestra en la hoja de cálculo de muestra, es posible que esta modificación no se pueda utilizar. Tenga cuidado con esto.
Cuando setValue se usa en un ciclo, el costo del proceso se vuelve alto. Si desea reducir el costo del proceso en su situación, puede hacerlo utilizando Sheets API de la siguiente manera. En este caso, habilite Sheets API en los servicios avanzados de Google.
De
const rngList = sheet.getRangeList(destRng).getRanges(); for (let n = 0; n < data.length; n++) { rngList[n].setValue(data[n]) }A
const sheetName = sheet.getSheetName(); const reqs = destRng.map((e, i) => ({ range: `'${sheetName}'!${e}`, values: [[data[i]]] })); Sheets.Spreadsheets.Values.batchUpdate({ data: reqs, valueInputOption: "USER_ENTERED" }, ss.getId());Los valores y el rango de destino deben tener el mismo número de elementos, suponiendo que esto sea cierto, no es necesario tener bucles for anidados, un solo bucle for es suficiente.
En otras palabras, en lugar de
for (let n = 0; n < data.length; n++) { for (let i = 0; i < rngList.length; i++) { let dado = data[n] rngList[i].setValue(dado)//It sets the first value throughout the rngList } }usar
for (let n = 0; n < data.length; n++) { rngList[n].setValue(data[n]) }