見出し画像

GASでdiscordに天気予報を通知するコード

天気予報を活用して、あなたの毎日をより良いものにしませんか?天候の変化に振り回されることなく、効率的に1日を過ごすためのヒントをお教えします。さあ、一緒に天気予報の読み方をマスターして、快適な毎日を手に入れましょう!この記事では、天気予報の基本的な構成要素と、それらを日常生活にどう活かすかについて解説します。天気、気温、降水確率など、各要素の意味と重要性を理解することで、外出の計画や服装の選択がぐっと楽になります。さらに、複数の情報源を比較して精度の高い予報を見極めるコツもお伝えします。天気予報を上手に活用すれば、突然の雨に慌てたり、暑さ寒さに苦しんだりすることも減るはずです。この記事を読み終えたあなたは、より自信を持って1日の計画を立てられるようになるでしょう。それでは早速、天気予報マスターへの第一歩を踏み出しましょう!


主要機能

  1. 天気予報データの取得

  2. メール送信

  3. Discord通知

  4. Slack通知

  5. 定期実行の設定

詳細解説

1. 天気予報データの取得(sendWeatherForecast関数)

この関数は、日本気象庁のAPIを使用して天気予報データを取得します。

javascript
const url = `https://www.jma.go.jp/bosai/forecast/data/forecast/${areaCodes[city]}.json`;
const response = UrlFetchApp.fetch(url);
const json = JSON.parse(response.getContentText());

取得したデータから以下の情報を抽出します:

  • 天気

  • 最高気温

  • 最低気温

  • 時間ごとの降水確率

2. メール送信

取得した天気予報データをメールで送信します。

javascript
const subject = `今日の天気予報 (さいたま市の降水確率: ${saitamaRainProb}%)`;
MailApp.sendEmail(recipient, subject, emailBody);

メールの件名にはさいたま市の降水確率が含まれます。

3. Discord通知(sendToDiscord関数)

Discord用のWebhook URLを使用して、天気予報をDiscordチャンネルに送信します。

javascript
const webhookUrl = PropertiesService.getScriptProperties().getProperty('DISCORD_WEBHOOK');
const payload = {
  content: message
};
UrlFetchApp.fetch(webhookUrl, options);

4. Slack通知(sendToSlack関数)

Slack用のWebhook URLを使用して、天気予報をSlackチャンネルに送信します。

javascript
const webhookUrl = PropertiesService.getScriptProperties().getProperty('slack_webhook');
const payload = {
  text: message
};
UrlFetchApp.fetch(webhookUrl, options);

5. 定期実行の設定(setWeTrigger関数)

この関数は、スクリプトを毎日朝6時に自動実行するようにトリガーを設定します。

javascript
ScriptApp.newTrigger('sendWeatherForecast')
  .timeBased()
  .everyDays(1)
  .atHour(6)
  .create();

セキュリティとプライバシー

このスクリプトでは、メールアドレスやWebhook URLなどの機密情報を直接コードに記述せず、PropertiesServiceを使用して安全に管理しています。

javascript
const recipient = PropertiesService.getScriptProperties().getProperty('MAIN_MAIL');');

まとめ

このスクリプトは、Google Apps Scriptを使用して天気予報の自動通知システムを構築しています。日本気象庁のAPIからデータを取得し、複数のプラットフォーム(メール、Discord、Slack)に情報を配信することで、ユーザーが毎日の天気情報を簡単に確認できるようになっています。定期実行機能により、ユーザーは手動で操作することなく、毎朝最新の天気予報を受け取ることができます。また、さいたま市の降水確率をメールの件名に含めることで、急な雨への対策が必要かどうかを素早く判断できるようになっています。

最後に

このままコピペできるようにコードをはつけておきます



function sendWeatherForecast() {
  // さいたま市と東京都中央区のエリアコード
  const areaCodes = {
    'さいたま市': '110000',
    '東京都中央区': '130000'
  };
  
  let emailBody = '';
  let discordMessage = '';
  let slackMessage = '';
  let saitamaRainProb = '';

  for (let city in areaCodes) {
    const url = `https://www.jma.go.jp/bosai/forecast/data/forecast/${areaCodes[city]}.json`;
    const response = UrlFetchApp.fetch(url);
    const json = JSON.parse(response.getContentText());

    const weatherData = json[0].timeSeries[0];
    const date = new Date(weatherData.timeDefines[0]);
    const weather = weatherData.areas[0].weathers[0];
    const maxTemp = json[0].timeSeries[2].areas[0].temps[1];
    const minTemp = json[0].timeSeries[2].areas[0].temps[0];

    const cityForecast = `${city}の天気予報(${date.getMonth() + 1}${date.getDate()}日):\n` +
                         `天気: ${weather}\n` +
                         `最高気温: ${maxTemp}°C\n` +
                         `最低気温: ${minTemp}°C\n`;

    emailBody += cityForecast;
    discordMessage += cityForecast;
    slackMessage += cityForecast;

    // 時間ごとの降水確率を取得
    const hourlyRainProb = json[0].timeSeries[1].areas[0].pops;
    const rainProbText = "時間ごとの降水確率:\n" +
                         hourlyRainProb.map((prob, i) => `${i * 3}時-${i * 3 + 3}時: ${prob}%`).join('\n');

    emailBody += rainProbText + "\n\n";
    discordMessage += rainProbText + "\n\n";
    slackMessage += rainProbText + "\n\n";

    // さいたま市の降水確率を件名用に保存
    if (city === 'さいたま市') {
      saitamaRainProb = hourlyRainProb[0];
    }
  }

  // メールを送信
  const recipient = PropertiesService.getScriptProperties().getProperty('MAIN_MAIL');
  const subject = `今日の天気予報 (さいたま市の降水確率: ${saitamaRainProb}%)`;
  
  MailApp.sendEmail(recipient, subject, emailBody);

  // Discordに通知を送信
  sendToDiscord(discordMessage);

  // Slackに通知を送信
  sendToSlack(slackMessage);
}

function sendToDiscord(message) {
  const webhookUrl = PropertiesService.getScriptProperties().getProperty('DISCORD_WEBHOOK');
  const payload = {
    content: message
  };

  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(webhookUrl, options);
}

function sendToSlack(message) {
  const webhookUrl = PropertiesService.getScriptProperties().getProperty('slack_webhook');
  const payload = {
    text: message
  };

  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(webhookUrl, options);
}

function setWeTrigger() {
  // 既存のトリガーをすべて削除
  const triggers = ScriptApp.getProjectTriggers();
  for (let i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }
  
  // 毎朝6時に実行するトリガーを設定
  ScriptApp.newTrigger('sendWeatherForecast')
    .timeBased()
    .everyDays(1)
    .atHour(6)
    .create();
}


この記事が気に入ったらサポートをしてみませんか?