Remix – Google Calendar APIによるイベントの生成

Remix

参考

https://developers.google.com/meet/api/guides/quickstart/nodejs?hl=ja

https://dev.to/arindam_1729/i-built-an-event-scheduler-in-nodejs-using-google-calendar-api-4c5b

準備

  • Google Cloud アカウントが必要
  • Google Workspaceの管理者アカウントが必要

注意

  • Google meetの生成(conferenceDataVersion: 1)は生成に失敗する
    • Invalid conference type valueエラーが発生、あきらめてGoogle Meet APIを試す

手順

Google Calendar APIを有効にする

サービスアカウントの作成

  • サービスアカウントを作成し、IdとEmailを取得する
  • 秘密鍵を作成する
    • jsonタイプで作成

Google Workspace管理者による権限付与

  • Google Workspace >「セキュリティ」→「APIの制御」→「ドメイン全体の権限」
  • 以下を、新規登録する
    • サービスアカウントのClientID(数字)を入力
    • スコープとして「https://www.googleapis.com/auth/calendar,https://www.googleapis.com/auth/calendar.events」を入力
  • デフォルトのカレンダーの共有設定が必要な場合もあり

カレンダーで共有設定

共有するカレンダーのドットメニューから共有設定メニューを開く

  • 以下の権限を付与する
    • サービスアカウントのEmailを入力する
    • 「予定の変更および共有の管理ができる」を選択する

ソース

パッケージインストール

npm install googleapis

export const action: ActionFunction = async ({ request }) => {
  const { summary, description, start_date, end_date } = await request.json();
  const auth = new google.auth.GoogleAuth({
    credentials: {
      client_email: process.env.GOOGLE_CLIENT_EMAIL,
      private_key: process.env.GOOGLE_PRIVATE_KEY?.replace(/\\n/g, "\n"),
    },
    scopes: [
      "https://www.googleapis.com/auth/calendar",
      "https://www.googleapis.com/auth/calendar.events"
    ],
  });
  const calendar = google.calendar({ version: "v3", auth });
  const startDate = new Date();
  const endDate = new Date(startDate.getTime() + 15 * 60 * 1000);

  try {
    const calendarId = process.env.GOOGLE_CALENDAR_OWNER_EMAIL;

    const event = {
        summary: summary,
        description: description,
        start: {
          dateTime: start_date,
          timeZone: "Africa/Nairobi",
        },
        end: {
          dateTime: end_date,
          timeZone: "Africa/Nairobi",
        },
        conferenceData: {
          createRequest: {
            requestId: `sample-meet-link-${Date.now()}`,
            conferenceSolutionKey: { 
              type: "hangoutsMeet"
            },
          },
        },
    };
    const result = await calendar.events.insert({
        calendarId: calendarId,
        resource: event,
        auth: auth,
        conferenceDataVersion: 0);

    console.log(result)
    //console.log("Event created successfully:", result);
    return json({
      event: result
    });
  } catch (err) {
    console.error("Error creating event:", err);
  }
};

GOOGLE_CALENDAR_OWNER_EMAIL={カレンダーID、プライマリーではGoogleユーザーのメアド}
GOOGLE_CLIENT_EMAIL={サービスアカウントのEmail}
GOOGLE_PRIVATE_KEY={秘密鍵}

関連記事

カテゴリー

アーカイブ

Lang »