Tengo una hoja de cálculo de Google donde recupero datos usando el complemento de Google Analytics. En una pestaña, combino todos los datos y uso esta pestaña específica para mi informe de Google Datastudio. Aquí analizo los datos de mi campaña de Google Ads: los costos y las conversiones.
Esta hoja de cálculo tiene varias pestañas (cada pestaña contiene una conversión específica). Necesito poder leer y escribir en varias pestañas. Tiene que leer los datos de Google Analytics y escribir estos datos en otra hoja. Originalmente creé este script para leer desde 1 pestaña y para escribir en 1 pestaña y estaba funcionando. Entonces noté que tendré que hacer esto para casi todas las pestañas.
Este es mi guión actual:
function readAndWrite() { var spreadsheetId = 'xxx'; var counter = 0; var rangeName = ['readingTab1!A16:C','readingTab2!A16:C','readingTab3!A16:C','readingTab4!A16:C','readingTab5!A16:C']; var rangePush = ['writingTab1','writingTab2','writingTab3','writingTab4','writingTab5','writingTab5']; var values = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeName[counter]).values; var data = []; if (!values) { Logger.log('No data found.'); } else { Logger.log('Starting script.'); Logger.log('There are ' + values.length + ' unique rows.'); Logger.log(values[0][2]); while (counter < 5){ data.length = 0; for (var row = 0; row < values.length; row++) { var campaign = values[row][0]; var date = values[row][1]; var cost = values[row][2]; data.push({range: rangePush[counter], values: [[date, campaign, cost]]}); } counter++; Sheets.Spreadsheets.Values.batchUpdate({data: data, valueInputOption: "USER_ENTERED"},spreadsheetId); } } Logger.log('Finished.'); }
En rangeName, he creado una matriz con los nombres y rangos de mi pestaña desde donde debería leer. En rangePush, creé una matriz con los nombres a los que debería enviar los datos.
Cuando ejecuto el script recibo el siguiente error:
GoogleJsonResponseException: la llamada API a sheets.spreadsheets.values.batchUpdate falló con el error: datos no válidos [1886]: no se puede analizar el rango: writingTab2.
¿Hay alguien que pueda ver lo que va mal y pueda ayudarme aquí? Espero que mi explicación sea clara, si no, por favor hágamelo saber.
¡Gracias!
Creo que su objetivo es el siguiente.
readingTab#!A16:C
a la hoja writingTab#
usando Sheets API con Google Apps Script.Si mi comprensión es correcta, ¿qué tal la siguiente modificación?
Al principio, sobre su error, cuando vi su hoja de cálculo de muestra, hay 3 hojas de lectura y escritura de 'readingTab1!A16:C', 'readingTab2!A16:C', 'readingTab3!A16:C'
y 'writingTab1', 'writingTab2', 'writingTab3'
. Pero su script usa while (counter < 5){
. Por esto, el rango se vuelve undefined
después de que el counter
es más de 4. Pensé que esta podría ser la razón de su problema.
Para lograr su objetivo eliminando este problema, ¿qué tal el siguiente script modificado?
Cuando se utilizan los métodos spreadsheets.values.batchGet
y spreadsheets.values.batchUpdate
, la secuencia de comandos se convierte en la siguiente secuencia de comandos simple.
function readAndWrite() { var spreadsheetId = 'xxx'; var rangeName = ['readingTab1!A16:C', 'readingTab2!A16:C', 'readingTab3!A16:C']; var rangePush = ['writingTab1', 'writingTab2', 'writingTab3']; var values = Sheets.Spreadsheets.Values.batchGet(spreadsheetId, {ranges: rangeName}).valueRanges; values.forEach((v, i) => v.range = rangePush[i]); Sheets.Spreadsheets.Values.batchUpdate({ data: values, valueInputOption: "USER_ENTERED" }, spreadsheetId); }
'readingTab1!A16:C', 'readingTab2!A16:C', 'readingTab3!A16:C'
y 'writingTab1', 'writingTab2', 'writingTab3'
. Cuando agregue más hojas, agréguelas a las matrices de rangeName
y rangePush
. En este script, verifique nuevamente los valores de rangeName
y rangePush
y los nombres de las hojas de su hoja de cálculo.
Este script utiliza la API de hojas. Por lo tanto, habilite Sheets API en los servicios avanzados de Google.
Creo que en su situación, el servicio de hoja de cálculo en lugar de la API de hojas también puede lograr su objetivo. Pero creo que el costo del proceso será menor cuando se use Sheets API. Pero, cuando desee lograr su objetivo sin usar Sheets API, también puede usar el siguiente script.
function readAndWrite2() { var spreadsheetId = 'xxx'; var rangeName = ['readingTab1!A16:C', 'readingTab2!A16:C', 'readingTab3!A16:C']; var rangePush = ['writingTab1', 'writingTab2', 'writingTab3']; var ss = SpreadsheetApp.openById(spreadsheetId); rangeName.forEach((r, i) => ss.getRange(r).copyTo(ss.getSheetByName(rangePush[i]).getRange("A1"))); }