구글 스프레드시트에 매일 날씨 자동으로 입력하는 방법

매일 아침 날씨를 확인하고 스프레드시트에 기록하는 일이 번거로우셨다면, 이 방법으로 완전히 자동화할 수 있어요. 외부 날씨 API와 Google Apps Script를 연결하면 지정한 시간에 자동으로 날씨 정보가 입력돼요.


매일 수동으로 날씨를 입력하던 불편함


회사에서 매일 날씨 데이터를 기록해야 하는 업무가 있었어요. 농업 관련 프로젝트였는데, 온도와 강수량을 매일 체크해서 스프레드시트에 입력해야 했죠. 처음엔 별거 아니라고 생각했는데 막상 해보니 정말 귀찮더라고요.


아침마다 기상청 사이트를 열고, 날씨를 확인하고, 스프레드시트를 열어서 날짜와 함께 입력하는 과정이 반복됐어요. 가끔 깜빡하면 며칠치를 한꺼번에 입력해야 했고요. 이런 단순 반복 작업을 자동화할 방법이 없을까 찾아보다가 Google Apps Script를 알게 됐어요.


남성 기상캐스터가 일요일 날씨 예보를 설명하는 그린보드 그래픽


Apps Script와 날씨 API로 완전 자동화하기


구글 스프레드시트에는 Apps Script라는 기능이 있어요. 쉽게 말해서 스프레드시트를 자동으로 제어할 수 있는 프로그래밍 도구예요. 여기에 날씨 API를 연결하면 매일 정해진 시간에 날씨 정보가 자동으로 입력돼요.


날씨 API 키 발급받기


먼저 날씨 데이터를 제공하는 API가 필요해요. OpenWeatherMap이 가장 많이 사용되는데, 무료로도 충분히 쓸 수 있어요.


OpenWeatherMap 사이트에 가입하고 API 키를 발급받으세요. 이메일 인증 후 바로 사용할 수 있어요. 무료 플랜은 하루 1000회까지 호출 가능하니 개인 용도로는 충분해요.


Apps Script 코드 작성하기


구글 스프레드시트 상단 메뉴에서 확장 프로그램 → Apps Script를 클릭하세요. 새 창이 열리면 아래 코드를 입력해요.


function importWeather() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var apiKey = "여기에_발급받은_API키_입력";
  var city = "Seoul";
  var url = "https://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=" + apiKey + "&units=metric&lang=kr";
  
  var response = UrlFetchApp.fetch(url);
  var data = JSON.parse(response.getContentText());
  
  var today = Utilities.formatDate(new Date(), "GMT+9", "yyyy-MM-dd");
  var weather = data.weather[0].description;
  var temp = Math.round(data.main.temp);
  var humidity = data.main.humidity;
  var rain = data.rain ? data.rain['1h'] || 0 : 0;
  
  sheet.appendRow([today, weather, temp + "°C", humidity + "%", rain + "mm"]);
}


이 코드는 서울의 날씨를 가져와서 날짜, 날씨 설명, 온도, 습도, 강수량을 한 줄에 입력해요. 도시명을 바꾸면 다른 지역 날씨도 가져올 수 있어요.


매일 자동 실행 설정하기


코드를 저장한 후 왼쪽 메뉴에서 트리거(시계 모양) 아이콘을 클릭하세요. 트리거 추가 버튼을 누르고 다음과 같이 설정해요.


  • 실행할 함수: importWeather
  • 이벤트 소스: 시간 기반
  • 시간 기반 트리거 유형: 일별 타이머
  • 시간 선택: 오전 7시~8시


이렇게 설정하면 매일 아침 7시에서 8시 사이에 자동으로 날씨 정보가 입력돼요.


더 많은 정보 추가하기


기본 코드를 조금만 수정하면 더 다양한 정보를 가져올 수 있어요. 예를 들어 최고/최저 기온, 체감 온도, 바람 정보 등도 추가할 수 있죠.


function importDetailedWeather() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var apiKey = "여기에_API키_입력";
  var city = "Seoul";
  var url = "https://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=" + apiKey + "&units=metric&lang=kr";
  
  var response = UrlFetchApp.fetch(url);
  var data = JSON.parse(response.getContentText());
  
  var today = Utilities.formatDate(new Date(), "GMT+9", "yyyy-MM-dd HH:mm");
  var weather = data.weather[0].description;
  var temp = Math.round(data.main.temp);
  var tempMin = Math.round(data.main.temp_min);
  var tempMax = Math.round(data.main.temp_max);
  var feelsLike = Math.round(data.main.feels_like);
  var humidity = data.main.humidity;
  var windSpeed = data.wind.speed;
  
  sheet.appendRow([
    today, 
    weather, 
    temp + "°C", 
    tempMin + "°C ~ " + tempMax + "°C",
    "체감 " + feelsLike + "°C",
    "습도 " + humidity + "%", 
    "풍속 " + windSpeed + "m/s"
  ]);
}


코딩 없이 간단하게 하는 방법


코드 작성이 어렵다면 API Connector 애드온을 사용하는 방법도 있어요. 구글 스프레드시트에서 확장 프로그램 → 애드온 가져오기로 가서 API Connector를 검색해 설치하세요.


설치 후 실행하면 API URL만 입력하면 돼요. 예를 들어:


https://api.openweathermap.org/data/2.5/weather?q=Seoul&appid=API키&units=metric&lang=kr


이 URL을 입력하고 실행하면 날씨 데이터가 시트에 자동으로 입력돼요. 스케줄 기능도 있어서 주기적으로 자동 갱신되도록 설정할 수 있어요.


여러 도시 날씨 한 번에 가져오기


여러 도시의 날씨를 동시에 가져오고 싶다면 코드를 이렇게 수정하세요.


function importMultipleCitiesWeather() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var apiKey = "API키_입력";
  var cities = ["Seoul", "Busan", "Daegu", "Incheon", "Gwangju"];
  
  var today = Utilities.formatDate(new Date(), "GMT+9", "yyyy-MM-dd");
  
  for (var i = 0; i < cities.length; i++) {
    var url = "https://api.openweathermap.org/data/2.5/weather?q=" + cities[i] + "&appid=" + apiKey + "&units=metric&lang=kr";
    var response = UrlFetchApp.fetch(url);
    var data = JSON.parse(response.getContentText());
    
    var weather = data.weather[0].description;
    var temp = Math.round(data.main.temp);
    var humidity = data.main.humidity;
    
    sheet.appendRow([today, cities[i], weather, temp + "°C", humidity + "%"]);
  }
}


에러 처리가 포함된 안정적인 코드


API 호출이 실패할 경우를 대비한 에러 처리를 추가하면 더 안정적으로 작동해요.


function importWeatherWithErrorHandling() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var apiKey = "API키_입력";
  var city = "Seoul";
  var url = "https://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=" + apiKey + "&units=metric&lang=kr";
  
  try {
    var response = UrlFetchApp.fetch(url);
    var data = JSON.parse(response.getContentText());
    
    var today = Utilities.formatDate(new Date(), "GMT+9", "yyyy-MM-dd HH:mm");
    var weather = data.weather[0].description;
    var temp = Math.round(data.main.temp);
    var humidity = data.main.humidity;
    var rain = data.rain ? data.rain['1h'] || 0 : 0;
    
    sheet.appendRow([today, weather, temp + "°C", humidity + "%", rain + "mm", "성공"]);
    
  } catch (error) {
    var today = Utilities.formatDate(new Date(), "GMT+9", "yyyy-MM-dd HH:mm");
    sheet.appendRow([today, "데이터 가져오기 실패", "-", "-", "-", error.toString()]);
    
    // 에러 발생 시 이메일 알림
    MailApp.sendEmail({
      to: "your-email@gmail.com",
      subject: "날씨 데이터 가져오기 실패",
      body: "에러 내용: " + error.toString()
    });
  }
}


특정 날씨 조건에 알림 보내기


특정 날씨 조건일 때 이메일 알림을 받고 싶다면 이런 코드를 사용하세요.


function checkWeatherAndNotify() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var apiKey = "API키_입력";
  var city = "Seoul";
  var url = "https://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=" + apiKey + "&units=metric&lang=kr";
  
  var response = UrlFetchApp.fetch(url);
  var data = JSON.parse(response.getContentText());
  
  var today = Utilities.formatDate(new Date(), "GMT+9", "yyyy-MM-dd");
  var weather = data.weather[0].description;
  var temp = Math.round(data.main.temp);
  var rain = data.rain ? data.rain['1h'] || 0 : 0;
  
  // 날씨 데이터 저장
  sheet.appendRow([today, weather, temp + "°C", rain + "mm"]);
  
  // 비가 오거나 온도가 특정 범위를 벗어나면 알림
  if (rain > 0 || temp > 35 || temp < -10) {
    var subject = "날씨 알림: ";
    var body = "";
    
    if (rain > 0) {
      subject += "비 예보 ";
      body += "현재 강수량: " + rain + "mm\n";
    }
    if (temp > 35) {
      subject += "폭염 주의 ";
      body += "현재 온도: " + temp + "°C (35도 이상)\n";
    }
    if (temp < -10) {
      subject += "한파 주의 ";
      body += "현재 온도: " + temp + "°C (-10도 이하)\n";
    }
    
    body += "\n날씨: " + weather;
    
    MailApp.sendEmail({
      to: "your-email@gmail.com",
      subject: subject,
      body: body
    });
  }
}


일주일 날씨 예보 가져오기


하루 날씨가 아닌 일주일 예보를 한 번에 가져오는 코드예요.


function importWeeklyForecast() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("주간예보");
  var apiKey = "API키_입력";
  var city = "Seoul";
  var url = "https://api.openweathermap.org/data/2.5/forecast?q=" + city + "&appid=" + apiKey + "&units=metric&lang=kr";
  
  var response = UrlFetchApp.fetch(url);
  var data = JSON.parse(response.getContentText());
  
  // 기존 데이터 삭제
  sheet.clear();
  sheet.appendRow(["날짜시간", "날씨", "온도", "습도", "강수확률"]);
  
  // 5일간 3시간 간격 예보 데이터
  for (var i = 0; i < data.list.length; i++) {
    var forecast = data.list[i];
    var dateTime = new Date(forecast.dt * 1000);
    var formattedDate = Utilities.formatDate(dateTime, "GMT+9", "MM/dd HH:mm");
    var weather = forecast.weather[0].description;
    var temp = Math.round(forecast.main.temp);
    var humidity = forecast.main.humidity;
    var rainProb = Math.round((forecast.pop || 0) * 100);
    
    sheet.appendRow([formattedDate, weather, temp + "°C", humidity + "%", rainProb + "%"]);
  }
}


날씨 데이터 기반 자동 차트 생성


수집한 날씨 데이터로 자동으로 차트를 생성하는 코드도 만들 수 있어요.


function createWeatherChart() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var dataRange = sheet.getDataRange();
  var numRows = dataRange.getNumRows();
  
  // 최근 30일 데이터로 차트 생성
  var chartRange = sheet.getRange(Math.max(1, numRows - 29), 1, Math.min(30, numRows), 3);
  
  var chart = sheet.newChart()
    .setChartType(Charts.ChartType.LINE)
    .addRange(chartRange)
    .setPosition(5, 7, 0, 0)
    .setOption('title', '최근 30일 온도 변화')
    .setOption('width', 600)
    .setOption('height', 400)
    .setOption('legend', {position: 'bottom'})
    .build();
  
  sheet.insertChart(chart);
}


자동화 후 달라진 업무 효율


이제 매일 아침 스프레드시트를 열면 이미 날씨 정보가 입력되어 있어요. 깜빡할 일도 없고, 주말이나 휴일에도 자동으로 기록되니까 정말 편해요.


처음엔 제대로 작동하는지 확인하느라 며칠간 수동으로도 체크했는데, 완벽하게 작동하더라고요. 이제는 날씨 데이터를 기반으로 한 분석 작업에 더 집중할 수 있게 됐어요.


특히 좋은 점은 데이터가 일정한 형식으로 정확하게 입력된다는 거예요. 수동으로 입력할 때는 가끔 실수도 있었는데, 자동화하니까 그런 걱정이 없어졌어요.


혹시 국내 기상청 데이터를 사용하고 싶다면 기상청 API를 활용하는 방법도 있어요. 기상청 API 허브에서 회원가입 후 인증키를 발급받아 사용하면 돼요. 국내 데이터가 더 정확하고 상세한 정보를 제공해요.


이런 자동화 방법은 날씨뿐만 아니라 환율, 주식 정보 등 다양한 외부 데이터를 가져오는 데도 활용할 수 있어요. 한 번 익혀두면 여러 업무에 응용할 수 있으니 시도해보세요.


파이썬으로 네이버 뉴스 제목 가져오는 방법