見出し画像

GASで作るDiscordへの自動通知


自動イベント通知をGASで作るまでの道のり

【before】

・Googleスプレッドシート1に入力したカレンダーから、本日と明日の予定を抽出してDiscordに通知

⇧実装は可能

FB

・シート1からのみ抽出させると量が多くなったときに処理が大変
・関数を使用して、シート2.3から本日と明日の予定を抽出
・抽出したものをリマインドする設定にする


【after】

①シート1にGoogleカレンダーから前後1ヶ月の予定同期
②シート2:クエリ関数で明日の予定抽出
③シート3:クエリ関数で今日の予定抽出
④Discordに指定時間に毎日通知
⑤カスタムメニュー追加、任意でシート1のカレンダー更新

カスタムメニュー実装できた!!!

Discordになぜか通知されなくて沼った…
実行押すたびにカレンダーが同期されるので時間かかる

function sendDiscordNotification() {
  const webhookUrl = "WebhookのURLを入力"; // DiscordのWebhook URL
  const now = new Date();
  const tomorrow = new Date(now.getTime() + 24 * 60 * 60 * 1000);
  tomorrow.setHours(0, 0, 0, 0);
  const dayAfterTomorrow = new Date(tomorrow.getTime() + 24 * 60 * 60 * 1000);

  // 明日の予定を取得
  const events = CalendarApp.getEvents(tomorrow, dayAfterTomorrow);

  // 本日の予定を取得
  const todayEvents = CalendarApp.getEvents(now, tomorrow);

  // メッセージ作成
  let message = "**📅 明日の予定:**\n";
  if (events.length > 0) {
    events.forEach(event => {
      const startTime = event.getStartTime();
      const summary = event.getTitle();
      message += `- ${startTime.toLocaleTimeString()} ${summary}\n`;
    });
  } else {
    message += "- 予定なし\n";
  }

  message += "\n**📅 本日の予定:**\n";
  if (todayEvents.length > 0) {
    todayEvents.forEach(event => {
      const startTime = event.getStartTime();
      const summary = event.getTitle();
      message += `- ${startTime.toLocaleTimeString()} ${summary}\n`;
    });
  } else {
    message += "- 予定なし\n";
  }

  // Discordへ通知送信
  const payload = {
    content: message
  };

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

  UrlFetchApp.fetch(webhookUrl, options);
}
// カスタムメニューの追加
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('カスタムメニュー')
    .addItem('カレンダー同期', 'syncCalendarToSheet')
    .addToUi();
}

// Googleカレンダーとスプレッドシートの同期
function syncCalendarToSheet() {
  const calendarId = 'primary'; // GoogleカレンダーID(デフォルトは 'primary')
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
  if (!sheet) {
    SpreadsheetApp.getUi().alert('シート1が見つかりません。スプレッドシートにシート1を追加してください。');
    return;
  }

  const now = new Date();
  const oneMonthAgo = new Date(now.getFullYear(), now.getMonth() - 1, now.getDate());
  const oneMonthLater = new Date(now.getFullYear(), now.getMonth() + 1, now.getDate());

  // 過去1か月から今後1か月までのイベントを取得
  const events = CalendarApp.getCalendarById(calendarId).getEvents(oneMonthAgo, oneMonthLater);

  // スプレッドシートのデータをクリア
  sheet.clear();
  sheet.appendRow(['日付', '開始時間', '内容']);

  // イベント情報をスプレッドシートに書き込む
  events.forEach(event => {
    const startDate = event.getStartTime();
    sheet.appendRow([
      Utilities.formatDate(startDate, Session.getScriptTimeZone(), 'yyyy-MM-dd'),
      Utilities.formatDate(startDate, Session.getScriptTimeZone(), 'HH:mm'),
      event.getTitle()
    ]);
  });

  SpreadsheetApp.getUi().alert('カレンダー情報が同期されました。');
}

実際のリマインド時間を入れたら実行を押しても通知が来なくなってしまい、ひとまずトリガー設定に落ち着く

いいなと思ったら応援しよう!