Rainshadow Systems

Build a Weather-Delay Alert System for Outdoor Jobs: A Weekend Build

Build a Weather-Delay Alert System for Outdoor Jobs: A Weekend Build

If your work happens outside — roofing, painting, concrete, landscaping, tree service, pressure washing — the forecast decides your day more than your calendar does. The usual routine is checking the weather app the night before, guessing, and then making a round of awkward calls at 6 a.m. to push jobs. This weekend, replace that guesswork with a script that checks the forecast for you every morning and flags any job on your schedule that's actually at risk.

What you're building

A small automation that reads your job schedule from a spreadsheet, pulls tomorrow's forecast for each job's location, checks it against thresholds you set (rain chance, wind speed, temperature), and emails you a short heads-up listing only the jobs worth a second look. No app to install, no subscription, and it runs itself once it's set up.

The pieces

  • A job schedule in Google Sheets, with columns for date, customer, job type, and location (or just latitude/longitude — you can look these up once per site and reuse them).
  • Open-Meteo, a weather API that's free to call for non-commercial use and doesn't require an API key or account — you just send a request with a latitude and longitude and get forecast data back as JSON. For Canadian coverage specifically, Environment Canada also publishes forecast and observation data at no charge through the Meteorological Service of Canada's open data portal, including a city-page forecast feed if you'd rather work with a Canadian source.
  • Google Apps Script, which is free with any Google account, lives right inside the spreadsheet, and can run on a timer (say, 6 a.m. daily) without you touching it.

Step by step

  1. Open your job-schedule spreadsheet (or create a simple one with columns: Date, Customer, JobType, Lat, Lon).
  2. From the sheet, open Extensions > Apps Script and paste in a function that loops through tomorrow's rows and calls the forecast API for each location, using the UrlFetchApp service to make the request:
function checkWeatherAndAlert() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Schedule');
  var rows = sheet.getDataRange().getValues();
  var tomorrow = new Date();
  tomorrow.setDate(tomorrow.getDate() + 1);
  var flagged = [];

  for (var i = 1; i < rows.length; i++) {
    var jobDate = new Date(rows[i][0]);
    if (jobDate.toDateString() !== tomorrow.toDateString()) continue;

    var lat = rows[i][3], lon = rows[i][4];
    var url = 'https://api.open-meteo.com/v1/forecast?latitude=' + lat +
      '&longitude=' + lon +
      '&daily=precipitation_probability_max,wind_speed_10m_max,temperature_2m_min' +
      '&timezone=America%2FVancouver&forecast_days=2';

    var forecast = JSON.parse(UrlFetchApp.fetch(url).getContentText());
    var rain = forecast.daily.precipitation_probability_max[1];
    var wind = forecast.daily.wind_speed_10m_max[1];

    if (rain > 60 || wind > 35) {
      flagged.push(rows[i][1] + ' (' + rows[i][2] + '): rain chance ' + rain +
        '%, wind ' + wind + ' km/h');
    }
  }

  if (flagged.length) {
    MailApp.sendEmail(Session.getActiveUser().getEmail(),
      'Weather check: ' + flagged.length + ' job(s) may need a call',
      flagged.join('\n'));
  }
}
  1. Set the thresholds (rain > 60, wind > 35 in the example) to whatever actually stops your kind of work. Painting and roofing crews usually care about rain probability; tree crews and anyone on a lift care more about wind; concrete crews care about overnight low temperature.
  2. Under Triggers in the Apps Script editor, add a time-based trigger to run checkWeatherAndAlert every morning. It'll email you a short list, or nothing at all on a clear day.
  3. Test it against a day you know is going to be rough — drop a fake row in tomorrow's date with a location you know is getting hit, and confirm the email shows up with the right numbers.

Make it fit the trade

  • Different thresholds per job type: add an if branch that checks rows[i][2] (job type) and applies a tighter wind limit for roofing than for, say, a fencing job.
  • Draft the customer message too: once a job is flagged, have the script build a short reschedule message (something like: Looks like rain is likely Thursday for your job, want to move to Friday or Monday?) into a draft email instead of sending straight to you, so you can review and send with one click.
  • Log it: write the flagged rows to a second sheet tab with a timestamp. When a customer asks why you moved their appointment, you've got the exact forecast numbers you acted on, not just your word for it.

None of this requires a developer. It's one script, one trigger, and a spreadsheet you probably already keep. The payoff is small but real: fewer 6 a.m. scramble calls, fewer no-shows because a customer forgot it was supposed to rain, and a paper trail when someone asks why the schedule moved. Build it Saturday morning, and it's quietly working before your next rainy week hits.

← All posts Work with us