見出し画像

【Discord】Discordにグーグルカレンダーの予定を毎日自動で投稿する【Google Calendar】

DiscordのBotについての知識がなくても大丈夫です!
この記事で完結できます!

こんな感じで毎日予定をお知らせしてくれるbotになります

先日引越しした際の予定です


私は同居人が3人いるのですが、予定をDiscordサーバー内で共有するために作ってみました


画像に沿って説明していきます!
赤い枠で囲った部分を確認してください


0, 事前準備

  • Googleアカウント

  • Discordアカウント

上記の二つのアカウントが事前に必要になります

下記と同じ新規のスプレッドシートを作成する

1, プロジェクト作成

新規プロジェクトを作成

https://script.google.com/home
上記にアクセスし、新しいプロジェクトを作成をクリック

コード作成
下記コードを全コピー
4か所書き換える部分があるので、コメントを確認する

const CALENDAR_ID = ''//自分のカレンダーIDに書き換え
const USER_NAME = 'わかしお'//自分の名前に書き替え

const WEBHOOK_URL = ''//webhook の URL
const URL = ""//スプレッドシートのURL

//シートとその最終行数、シートのデータを取得
let spreadsheet = SpreadsheetApp.openByUrl(URL)
let sheet = spreadsheet.getActiveSheet()

let weekday = ["日", "月", "火", "水", "木", "金", "土"]



function notifyDaily() {
  let dt = new Date()
  let endDate = new Date(2023, 6, 1)
  let row = new Array()
  let message = ""

  if (dt <= endDate) {
    message = "今日の予定\n=======================\n";
    dt.setDate(dt.getDate());
    row.push(String(Utilities.formatDate(dt, 'JST','yyyy/MM/dd')));
    message += Utilities.formatDate(dt, 'JST', '■ MM/dd(' + weekday[dt.getDay()] + ')') + "\n";
    message +="-----------------------\n";

    let events = _fetchEvent(dt);
    if ( events == '' ) {
      message +="予定はありません\n\n";
    }

    let dayText = "";
    for ( let j = 0; j < events.length; j++ ) {
      dayText += _makeDayText(events, j)
      row.push(events[j].getTitle());
      row.push(String(Utilities.formatDate(events[j].getStartTime(), "JST", "yyyy/MM/dd HH:mm")));
      row.push(String(Utilities.formatDate(events[j].getEndTime(), "JST", "yyyy/MM/dd HH:mm")));
    }

    message += dayText + "=======================";
  } else {
    message = "https://script.google.com/home" + "\nここから削除↑";
  }
  let payload = {
    username: USER_NAME + "予定",
    content: message,
  };
_notify(payload, row)
}

function notifyChange() {
  let dt = new Date()
  let endDate = new Date(2023, 6, 1)
  let row = new Array()
  let rowForCompare = new Array()
  let message = ""

  if (dt <= endDate) {
    message = "@everyone 今日の予定変わりました\n=======================\n";
    dt.setDate(dt.getDate());
    row.push(String(Utilities.formatDate(dt, 'JST','yyyy/MM/dd')));
    rowForCompare.push(new Date(String(Utilities.formatDate(dt, 'JST','yyyy/MM/dd'))));
    message += Utilities.formatDate(dt, 'JST', '■ MM/dd(' + weekday[dt.getDay()] + ')') + "\n";
    message +="-----------------------\n";

    let events = _fetchEvent(dt);
    if ( events == '' ) {
      message +="予定はありません\n\n";
    } 

    let dayText = "";
    for ( let j = 0; j < events.length; j++ ) {
      dayText += _makeDayText(events, j)
      row.push(events[j].getTitle());
      row.push(String(Utilities.formatDate(events[j].getStartTime(), "JST", "yyyy/MM/dd HH:mm")));
      row.push(String(Utilities.formatDate(events[j].getEndTime(), "JST", "yyyy/MM/dd HH:mm")));
      rowForCompare.push(events[j].getTitle());
      rowForCompare.push(events[j].getStartTime());
      rowForCompare.push(events[j].getEndTime());
    }

    message += dayText + "=======================";
  } else {
    message = "https://script.google.com/home" + "\nここから削除↑";
  }
  let payload = {
    username: USER_NAME + "予定",
    content: message,
  };

  //jsonに変換して比較
  let value_json = JSON.stringify(_fetchLastNotify());
  let rowForCompare_json = JSON.stringify(rowForCompare);
  if (value_json != rowForCompare_json) {
    _notify(payload, row)
  }
}


function _fetchEvent(dt) {
  let calendar = CalendarApp.getCalendarById(CALENDAR_ID);
  let calendarName = calendar.getId()
  let events = calendar.getEventsForDay(dt);
  if ( calendarName == undefined || events.length == 0 ) {
    events = ''
  }
  return events
}

function _makeDayText(events, i) {
  let dayText = ""
  dayText += String(Utilities.formatDate(events[i].getStartTime(), "JST", "HH:mm"));
  dayText += "-";
  dayText += String(Utilities.formatDate(events[i].getEndTime(), "JST", "HH:mm"));
  dayText += "\n";
  dayText += "・" + String(events[i].getTitle()+'\n');
  dayText +="-----------------------\n";
  return dayText
}

function _fetchLastNotify() {
  let maxRow = sheet.getDataRange().getLastRow()
  let values = sheet.getDataRange().getValues()
  //スプレッドシートの空の要素を削除(比較のため)
  let value = values[maxRow-1].filter(v => v != "")
  return value
}

function _notify(payload, row) {
  UrlFetchApp.fetch(WEBHOOK_URL, {
    method: "post",
    contentType: "application/json",
    payload: JSON.stringify(payload),
  });
  sheet.appendRow(row)
}

(このコードには当日の予定が変更された際に、予定変更を通知するためのコードも含みますが、そちらの使い方は別の記事で紹介します)
下記テキストエリアの既存のコードを削除して、コピーしてきたコードを張り付ける

プロジェクト名をわかりやすく設定して Ctrl + S で保存
(「実行」または「デバッグ」ボタンを押せば即時に今日の予定が投稿されるので、動作確認したい際は押す)

2, プロジェクト作成後の手順

時計マーク(=トリガー)を選択

トリガーを追加を選択

トリガーのルールを設定し、保存

上のプルダウンによって下のプルダウンの内容が変わるので、上から順に選択し保存する

以上で、完了です!

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