Estoy trabajando en una hoja de programación/resumen del proyecto en la que puedo realizar un seguimiento de todos mis trabajos y realizar cambios de programación basados en las previsiones meteorológicas en la ubicación específica del trabajo.
He podido extraer con éxito los datos meteorológicos a través de una API desde mi hoja de ubicación, con una ubicación y un lugar que extrajo datos en mi hoja de informe.
const key = "99071c9629eded162bb1a2e8b7843888" const ss = SpreadsheetApp.getActiveSpreadsheet() const wsLocation = ss.getSheetByName("Location") const wsLiveData = ss.getSheetByName("Live Data") const wsHistory = ss.getSheetByName("History") const location = wsLocation.getRange("A2").getValue() const units = wsLocation.getRange("B2").getValue() const highCellHa = wsLiveData.getRange("B2") const lowCellHa = wsLiveData.getRange("C2") let apiURL = "https://api.openweathermap.org/data/2.5/weather?q=${location}&appid=${key}&units=${units}" const resText = UrlFetchApp.fetch(apiURL).getContentText() const resJSON = JSON.parse(resText) console.log(resJSON["main"]) const tempMin = resJSON["main"]["temp_min"] const tempMax = resJSON["main"]["temp_max"] highCell.setValue(tempMax) lowCell.setValue(tempMin) wsHistory.appendRow([new Date(),tempMax,tempMin]) } }Sin embargo, necesito poder hacer que extraiga los datos meteorológicos de varias ubicaciones y luego colocar los datos de cada ubicación respectiva en la hoja de informe en su propio lugar. He intentado usar un bucle for, pero fue en vano. Cualquier idea es bienvenida y apreciada!!
En su guión, ¿qué tal la siguiente modificación?
function myFunction() { const key = "###"; // Please set your key. const ss = SpreadsheetApp.getActiveSpreadsheet(); const wsLocation = ss.getSheetByName("Location"); const wsHistory = ss.getSheetByName("History") const location = wsLocation.getRange("A2:A" + wsLocation.getLastRow()).getValues(); const units = wsLocation.getRange("B2").getValue(); const date = new Date(); const reqs = location.map(([a]) => ({url: `https://api.openweathermap.org/data/2.5/weather?q=${a}&appid=${key}&units=${units}`, muteHttpExceptions: true})); const res = UrlFetchApp.fetchAll(reqs); const values = res.map(r => { if (r.getResponseCode() == 200) { const temp = JSON.parse(r.getContentText()); return [date, temp.main.temp_min, temp.main.temp_max]; } return [date, null, null]; }); wsHistory.getRange(wsHistory.getLastRow() + 1, 1, values.length, values[0].length).setValues(values); } En esta modificación, se supone que los valores de location se colocan en la columna "A" de la hoja "Ubicación". Tenga cuidado con esto. Y, los valores recuperados se colocan en la hoja History .
En su script, highCell y lowCell no están declarados. Tenga cuidado con esto.
La apiURL debe estar encerrada entre tildes para usar literales de plantilla ${}
Prueba esto:
function lfunko() { const key = "99071c9629eded162bb1a2e8b7843888" const ss = SpreadsheetApp.getActiveSpreadsheet() const wsLocation = ss.getSheetByName("Location") const wsLiveData = ss.getSheetByName("Live Data") const wsHistory = ss.getSheetByName("History") const locations = wsLocation.getRange(2, 1, wslocation.getLastRow() - 1).getValues() const units = wsLocation.getRange("B2").getValue() const highCellHa = wsLiveData.getRange("B2") const lowCellHa = wsLiveData.getRange("C2"); locations.forEach(l => { let apiURL = `https://api.openweathermap.org/data/2.5/weather?q=${l}&appid=${key}&units=${units}`; let resText = UrlFetchApp.fetch(apiURL).getContentText() let resJSON = JSON.parse(resText) let tempMin = resJSON["main"]["temp_min"] let tempMax = resJSON["main"]["temp_max"] highCell.setValue(tempMax); lowCell.setValue(tempMin); wsHistory.appendRow([l, `Max: ${tempMax} Min: ${tempMin}`]); }); }Es posible que deba haber otros datos en las ubicaciones, pero dado que no ha proporcionado su estructura de datos, no hay forma de saberlo.