Action
7 Day Forecast
This action requires an API key from DarkSky.
Dark Sky API site.
The first time this action is run, you will be prompt to add a Dark Sky API key, which will be remembered in Credentials for future use.
You can edit the script to change the units of measurement. All the values to change are at the top of the script.
This action will display a sheet with the current weather and display a 7 day forecast.
It will adapt for dark mode.
Steps
-
script
// weatherLocation sets the units, go to https://darksky.net/dev/docs for list of unit types. // "us" or "ca" would be the most common. var weatherLocation = "auto" // set displayed text for wind. change value below. let windUnit = "kph" // Set unit type for percipatation // Options are "Metric" "Imperial" let percipMesurmentType = "Metric" // Values below do not need to change let percipMesurmentSnow = '' let percipMesurementRain = '' if (percipMesurmentType === "Metric"){ percipMesurmentSnow = 'cm' percipMesurementRain = 'mm' } if (percipMesurmentType === "Imperial"){ percipMesurmentSnow = 'in' percipMesurementRain = 'in' } var percipTypePrint = "" // set personal API key credential let credential = Credential.create("Dark Sky API Key", "Enter your Dark Sky API key, which can be copied from the darksky.net developer console page after creating a free account."); credential.addTextField("key", "API Key"); credential.authorize(); let apiKey = credential.getValue("key"); // Define function for parsing day of week var day; var month; var percipAmmounts = '' function getDayOfWeekString(dayAsNumber) { switch (dayAsNumber) { case 0: day = "Sunday"; break; case 1: day = "Monday"; break; case 2: day = "Tuesday"; break; case 3: day = "Wednesday"; break; case 4: day = "Thursday"; break; case 5: day = "Friday"; break; case 6: day = "Saturday"; } return day } function getMonthString(monthAsNumber) { switch (monthAsNumber) { case 0: month = "January"; break; case 1: month = "February"; break; case 2: month = "March"; break; case 3: month = "April"; break; case 4: month = "May"; break; case 5: month = "June"; break; case 6: month = "July"; break; case 7: month = "August"; break; case 8: month = "September"; break; case 9: month = "October"; break; case 10: month = "November"; break; case 11: month = "December"; } return month } // method to fetch forecast data let getForecast = (latitude, longitude) => { // build URL to Dark Sky API forecast endpoint let endpoint = `https://api.darksky.net/forecast/${apiKey}/${lat},${lon}?units=${weatherLocation}`; // create and make HTTP request let http = HTTP.create(); let response = http.request({ "url": endpoint, "method": "GET" }); // check for a success 200 response if (response.statusCode != 200) { context.fail(); console.log("Dark Sky Error: " + response.error); return null; } // parse response JSON to object let data = JSON.parse(response.responseText); if (!data) { context.fail(); console.log("Dark Sky Error: Unable to parse response"); return null; } // return the forecast data object return data; } let lat = draft.processTemplate("[[latitude]]") let lon = draft.processTemplate("[[longitude]]"); let darkSkyURL = `https://darksky.net/forecast/${lat},${lon}`; let data = getForecast(lat, lon); if (data) { // See details on all information in response at API docs // https://darksky.net/dev/docs let d = []; //time var date = new Date(); var formatDate; var getDay; var fomatDateString; var getMonth; var getYear; var dayForJason; function getTimeFromJason (numberForData) { let time = data.daily.data[numberForData].time*1000 date.setTime(time) formatDate = date.getDate() getDay = date.getDay() fomatDateString = date.toDateString(); getDayOfWeekString(getDay) getMonth = date.getMonth() getMonthString(getMonth) getYear = date.getFullYear() dayForJason = numberForData if(data.daily.data[dayForJason].hasOwnProperty('precipAccumulation')){ if (data.daily.data[dayForJason].precipType === "snow"){ percipTypePrint = percipMesurmentSnow } if (data.daily.data[dayForJason].precipType === "rain"){ percipTypePrint = percipMesurmentRain } percipAmmounts = `ammount ${(data.daily.data[dayForJason].precipAccumulation).toFixed(0)}`; } } d.push(`<h2>Currently</font></h2>`); d.push('') d.push(`<p><font color=" #A9A9A9">${(data.currently.summary)}</font></p>`); d.push(`<b>${(data.currently.temperature).toFixed(0)}° feels like ${(data.currently.apparentTemperature).toFixed(0)}°</font></b>`); d.push('') d.push(`<p>Cloud cover ${(data.currently.cloudCover*100).toFixed(0)}%</font></p>`); d.push('') d.push(`<p>Wind ${(data.currently.windSpeed).toFixed(0)}-${(data.currently.windGust).toFixed(0)}${windUnit}</font></p>`); d.push('') d.push('---') d.push('') getTimeFromJason(0) d.push('## '+ day + ', ' + month + ' ' + formatDate + ' ') d.push('') d.push(`<p><font color=" #A9A9A9"> ${(data.hourly.summary)}</font></p>`); d.push('') d.push(`<b>H: ${(data.daily.data[dayForJason].temperatureHigh).toFixed(0)}°</b>`); d.push('') d.push(`<b>L: ${(data.daily.data[dayForJason].temperatureLow).toFixed(0)}°</b>`); d.push('') d.push(`Cloud cover ${(data.daily.data[dayForJason].cloudCover*100).toFixed(0)}%`); d.push('') d.push(`Wind ${(data.daily.data[dayForJason].windSpeed).toFixed(0)}-${(data.daily.data[dayForJason].windGust).toFixed(0)}${windUnit}`); d.push('') d.push(`${(data.daily.data[dayForJason].precipProbability*100).toFixed(0)}% chance of ${data.daily.data[dayForJason].precipType} ${percipAmmounts}${percipTypePrint}`); percipAmmounts = '' d.push('') d.push('---') var i; for (i = 1; i < 8; i++) { getTimeFromJason(i) d.push('## '+ day + ', ' + month + ' ' + formatDate) d.push('') d.push(`<p><font color=" #A9A9A9">${(data.daily.data[dayForJason].summary)}</font></p>`); d.push('') d.push(`<b>H: ${(data.daily.data[dayForJason].temperatureHigh).toFixed(0)}°</b>`); d.push('') d.push(`<b>L: ${(data.daily.data[dayForJason].temperatureLow).toFixed(0)}°</b>`); d.push('') d.push(`Cloud cover ${(data.daily.data[dayForJason].cloudCover*100).toFixed(0)}%`); d.push('') d.push(`Wind ${(data.daily.data[dayForJason].windSpeed).toFixed(0)}-${(data.daily.data[dayForJason].windGust).toFixed(0)}${windUnit}`); d.push('') d.push(`${(data.daily.data[dayForJason].precipProbability*100).toFixed(0)}% chance of ${data.daily.data[dayForJason].precipType} ${percipAmmounts}${percipTypePrint}`); percipAmmounts = '' d.push('') d.push('---') d.push('') percipTypePrint = "" } //editor.setText(d.join("\n")); let s = d.join("\n") draft.setTemplateTag("displayText",s); } else { alert("Unable to fetch Dark Sky forecast information. Check action log for details"); } //editor.deactivate()
-
htmlpreview
<!DOCTYPE html> <html dir="auto"> <head> <title>Weather</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> @charset "utf-8"; :root { --main-bg-color: white; --main-color: black; --alternate-bg-color: #efefef; --alternate-color: #222222; --main-border-color: #BBBBBB; --link-color: #3a9fbf; } @media (prefers-color-scheme: dark) { :root { --main-bg-color: #222222; --main-color: #eeeeee; --alternate-bg-color: #444444; --alternate-color: #cccccc; --main-border-color: #AAAAAA; --link-color: #FC830A; } } html { font-size: 90%; font-family: iA Writer Duospace, iA Writer Quattro S, -apple-system; line-height: 1.0em; } body { margin: 0; padding: 1em; background-color: var(--main-bg-color); color: var(--main-color); } @media (max-device-width: 480px) {} @media (min-device-width: 481px) { body { margin: auto; max-width: 600px; } } blockquote { font-style: italic; margin: 1.5em 2em; padding: 1em; background-color: var(--alternate-bg-color); color: var(--alternate-color); } a { color: var(--link-color); } b { color: var(--link-color); } pre { display: block; overflow: scroll; width: 100%; background-color: var(--alternate-bg-color); padding: .5em 1em; margin: 1em 0; } code { background-color: var(--alternate-bg-color); color: var(--alternate-color); font-family: Menlo, Courier, sans-serif; padding: 2px 3px; } table { margin: 1.5em 0; border: 1px solid var(--main-border-color); border-collapse: collapse; } th { padding: .25em .5em; background: var(--alternate-bg-color); border: 1px solid var(--main-border-color); } td { padding: .25em .5em; border: 1px solid var(--main-border-color); } img { max-width: 90%; } </style> </head> <body> %%[[displayText]]%% </body> </html>
Options
-
After Success Default Notification Info Log Level Info
Items available in the Drafts Directory are uploaded by community members. Use appropriate caution reviewing downloaded items before use.