1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【GAS初心者向け】スプレッドシートからカレンダーにイベントを登録しよう!

Posted at

こんにちは!
GAS(Google Apps Script)勉強中で、お約束のようにGoogle Cloudとの連携もつまづいてしまった私。。。
同じように困っている方のために、GASを使用してGoogleスプレッドシートの情報をGoogleカレンダーに登録する方法をまとめてみました。

はじめに

GASは、Googleが提供するスクリプト言語で、JavaScriptをベースにしています。Google Workspace (Gmail, スプレッドシート, ドキュメント, カレンダーなど) を中心とした様々なGoogleサービスと連携し、自動化やデータ処理を行うことができます。

ちょいちょい設定するところがあり、「???」を連発しながら設定しました。。。

備忘録的な感じですが、同じ壁にぶつかっている初心者さんの助けになれば嬉しいです!

1. やりたいことの確認

私がこのGASプロジェクトで実現したいことは超シンプルです!

  • Googleスプレッドシートに書かれたイベント情報情報をGASを用いてGoogleカレンダーに登録したい。(スプレッドシートからサクッと予定を流し込みしたい)
  • 一度カレンダーに登録したものは、次回実行時に重複して登録されないようにしたい。

2. 事前準備:スプレッドシートを整えよう!

まずは、イベント情報を入力するためのスプレッドシートを作成します。

2-1. 新しいGoogleスプレッドシートを作成

  • Googleドライブにアクセスし、「+新規」→「Google スプレッドシート」を選択。
  • スプレッドシートの名前は「カレンダー登録データ」など、分かりやすいものにしましょう。

2-2. 1行目に以下のヘッダー(列名)を設定

  • A1: 登録済 (この列に「登録済」と書かれている行は、GASがスキップします。)
  • B1: タイトル (カレンダーイベントのタイトル)
  • C1: 開始日時 (イベントの開始日時。例: 2025/08/01 10:00 または 2025/8/1 9:00)
  • D1: 終了日時 (イベントの終了日時。例: 2025/08/01 11:00 または 2025/8/1 10:00)
  • E1: 説明 (イベントの詳細説明)
  • F1: 場所 (イベントの場所)

2-3. 2行目以降にテストデータを入力
入力時はA列は空欄のままでOKです。(GASのスクリプトを実行すると登録済と入力される)
スプレッドシートのテストデータはこんな感じ。

登録済 タイトル 開始日時 終了日時 説明 場所
月次会議 2025/08/01 10:00 2025/08/01 11:00 来月の進捗確認 本社会議室
顧客訪問 2025/08/05 14:30 2025/08/05 16:00 XX株式会社との打ち合わせ XX株式会社 オフィス

3. GASコードを書いてみよう!

スプレッドシートからGASエディタを開き、コードを作成します。

  • 準備したスプレッドシートを開き、メニューバーから「拡張機能」→「Apps Script」を選択します。新しいタブでGASエディタが開きます。

  • GASエディタの左上にあるプロジェクト名(通常は「無題のプロジェクト」)をクリックし、「カレンダー連携スクリプト」など、分かりやすい名前に変更します。

  • エディタに最初から書かれている function myFunction() { ... } のコードは全て削除、作成したのは次のコード。(今回はGeminiに作ってもらった)

    function createCalendarEventsFromSpreadsheet() {
      // ★1. スプレッドシートとシートの指定
      const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
      // !!!重要!!! ここをあなたのスプレッドシートの実際のシート名に修正してください!
      // 例: "シート1" または "Sheet1"
      const sheet = spreadsheet.getSheetByName("シート1"); 
    
      if (!sheet) {
        Browser.msgBox('エラー', '指定されたシート名が見つかりません。スクリプト内のシート名を確認してください。', Browser.Buttons.OK);
        return;
      }
    
      // ★2. カレンダーの指定
      // メインのカレンダーに登録する場合、"primary" を使用します。
      // 特定の既存カレンダーに登録する場合、そのカレンダーID(例: 'your_calendar_id@group.calendar.google.com')を指定します。
      // カレンダーIDの探し方: Googleカレンダー > マイカレンダーの三点リーダー(︙)> 設定と共有 > カレンダーの統合 > カレンダーID
      const calendarId = "primary"; // !!!重要!!! 必要に応じて変更してください
      const calendar = CalendarApp.getCalendarById(calendarId);
    
      if (!calendar) {
        Browser.msgBox('エラー', '指定されたカレンダーが見つかりませんでした。カレンダーIDを確認してください。', Browser.Buttons.OK);
        return;
      }
    
      // ★3. データ範囲の取得 (A列「登録済」を考慮)
      const startRow = 2; // データは2行目から始まる
      const startCol = 1; // データはA列から始まる (0-indexed なので A=0, B=1...)
      const numColumns = 6; // A列からF列まで取得 (6列)
    
      const lastRow = sheet.getLastRow();
      if (lastRow < startRow) {
        Browser.msgBox('情報', '登録するデータがスプレッドシートにありません(2行目以降にデータがありません)。', Browser.Buttons.OK);
        return;
      }
    
      const dataRange = sheet.getRange(startRow, startCol, lastRow - startRow + 1, numColumns);
      const data = dataRange.getValues(); // 全データを二次元配列で取得
    
      // ★4. 各行のデータを処理
      let registeredCount = 0;
      let errorCount = 0;
    
      for (let i = 0; i < data.length; i++) {
        const row = data[i];
        const currentRowNum = i + startRow; // 現在処理中のスプレッドシートの行番号
    
        // A列(登録済)をチェック。すでに「登録済」ならスキップ
        const registeredStatus = row[0]; // A列 (0-indexed)
        if (registeredStatus === "登録済") { 
          continue;
        }
    
        const title = row[1];       // B列 (タイトル)
        const startTimeStr = row[2]; // C列 (開始日時)
        const endTimeStr = row[3];   // D列 (終了日時)
        const description = row[4];  // E列 (説明)
        const location = row[5];     // F列 (場所)
    
        // タイトル、開始日時、終了日時が空の場合はスキップ(必須項目と仮定)
        if (!title || !startTimeStr || !endTimeStr) {
          sheet.getRange(currentRowNum, 1).setValue("スキップ (必須項目不足)"); 
          errorCount++;
          continue;
        }
    
        // 日付オブジェクトへの変換(Excelシリアル値にも対応)
        let startTime, endTime;
        try {
            // スプレッドシートから取得した値が数値(シリアル値)か文字列かで処理を分岐
            startTime = new Date(typeof startTimeStr === 'number' ? (startTimeStr - 25569) * 86400 * 1000 : startTimeStr);
            endTime = new Date(typeof endTimeStr === 'number' ? (endTimeStr - 25569) * 86400 * 1000 : endTimeStr);
    
            // 無効な日付の場合はスキップ
            if (isNaN(startTime.getTime()) || isNaN(endTime.getTime())) {
                sheet.getRange(currentRowNum, 1).setValue("スキップ (日時形式エラー)"); 
                errorCount++;
                continue;
            }
    
        } catch (e) {
            sheet.getRange(currentRowNum, 1).setValue("スキップ (日時解析エラー)"); 
            errorCount++;
            continue;
        }
    
    
        // イベントオプションを設定
        const options = {};
        if (description) {
          options.description = description;
        }
        if (location) {
          options.location = location;
        }
        // 他にもゲストやリマインダーなど、様々なオプションを設定可能
    
        try {
          // カレンダーにイベントを追加
          const event = calendar.createEvent(title, startTime, endTime, options);
          
          // スプレッドシートのA列に「登録済」とマーク
          sheet.getRange(currentRowNum, 1).setValue("登録済"); 
          registeredCount++;
    
        } catch (e) {
          // イベントの登録中にエラーが発生した場合、A列にエラー情報を書き込む
          sheet.getRange(currentRowNum, 1).setValue("エラー: " + e.message); 
          errorCount++;
        }
      }
    
      // 最終結果のメッセージをユーザーに表示
      let resultMsg = `処理が完了しました。\n新しく ${registeredCount} 件のイベントをカレンダーに登録しました。`;
      if (errorCount > 0) {
        resultMsg += `\n${errorCount} 件の処理中にエラーまたはスキップがありました。スプレッドシートのA列を確認してください。`;
      }
      Browser.msgBox('処理結果', resultMsg, Browser.Buttons.OK);
    }
    

コードの簡単な解説は次のとおりです。

  • シートとカレンダーの指定: getSheetByNamegetCalendarById で、どのシートのデータをどのカレンダーに入れるかを指定しています。
  • データの取得とループ: スプレッドシートのデータ(2行目以降)を1行ずつ読み込み、処理を繰り返します。
  • 重複登録の防止: A列が「登録済」になっている行は、continueでスキップされます。
  • 日付の変換: スプレッドシートの日時データは、そのままでは使えない場合があるので、new Date()でJavaScriptが扱える日付オブジェクトに変換しています。Excelのシリアル値でも大丈夫です!
  • イベントの作成とマーク: calendar.createEvent でカレンダーにイベントを追加し、成功したらスプレッドシートのA列に「登録済」と書き込んでいます。
  • エラー処理: 何らかの問題で登録できなかった場合は、A列にエラー内容を書き込み、ユーザーにメッセージを表示します。

もちろん、最後にコードを保存(フロッピーディスクアイコン)はお忘れなく。


4. 連携させよう ! Google Cloud Platform (GCP) の設定

作成したGASを実行したとき「このアプリはGoogleで確認されていません」という警告が表示される場合、作成したGASプロジェクトがGoogleサービス(カレンダーなど)にアクセスすることを、Googleがまだ正式に許可していないために表示されます。

これを解決するためには、GCPでOAuth(オーオース)同意画面を作成し、必要な「スコープ」(アクセス許可の範囲)を追加して、「テストユーザー」として自分自身を設定する必要があります

4-1. GCPプロジェクトの作成と特定

  1. GASエディタの左メニューにある「設定」(歯車のアイコン)をクリックします。
  2. 「Google Cloud Platform (GCP) プロジェクト」の項目を確認します。
    • Google Clloud Platformプロジェクトの下にある「プロジェクトを変更」ボタンをクリックします。
    • 表示されるダイアログで「新しいプロジェクトを作成」を選択します。(GCPのダッシュボード画面に遷移します。)
    • 左上の「プロジェクト情報」内の「プロジェクト設定に移動」をクリック
    • 設定」(歯車アイコン)をクリックすると、GCPプロジェクトの「プロジェクトID」と「プロジェクト番号」が表示されます。(今回必要なのはプロジェクト番号のほう)

4-2. OAuth同意画面の編集(または作成)

OAuth同意画面とは、GASがGoogleサービスにアクセスする際に、ユーザーに「このアプリはあなたの○○にアクセスしようとしています。許可しますか?」と表示される画面のことです。

  1. Google Cloud Consoleを開きます: https://console.cloud.google.com/
  2. 画面上部にあるプロジェクトセレクタ(現在のプロジェクト名が表示されている場所)をクリックします。
  3. 表示されるダイアログで、先ほど作成・特定したGCPプロジェクトを選択します。
  4. 左側のナビゲーションメニューから「APIとサービス」を展開し、「OAuth同意画面」をクリックします。
  5. 「OAuth同意画面」の設定を行います。
    • 設定していない場合は概要を選択、1️⃣のアプリ情報を入力します。
      • アプリ名:カレンダー連携スクリプト」など、分かりやすい名前を入力します。
      • ユーザーサポートメール: あなたのGoogleアカウントのメールアドレスを入力し、「次へ」をクリック。
    • 2️⃣の「対象」では「外部」を選択し、「次へ」をクリック。
    • 3️⃣連絡先情報として、メールアドレス(自分のアドレスでOK)を入力、「次へ」をクリック。
    • 4️⃣「Google API サービス: ユーザーデータに関するポリシー に同意します。」にチェックを入れ、「続行」をクリック。
    • 作成」ボタンをクリック。

4-3. 🌟 ここがポイント!「スコープ」の追加 🌟

いよいよ、アプリが何のデータにアクセスするのか(スコープ)を設定します。

  1. OAuth同意画面の編集」ページに入ったら、左側のメニューから「対象」(人マークのアイコン)をクリックします。
  2. 「対象」のページに移動したら、テストユーザーの下にある「+ Add Users」という青いボタンをクリックします。
  3. メールアドレスを入力」し、「保存」ボタンをクリック。
  4. 左側のメニューから「データアクセス」を選択し、「スコープを追加または削除」をクリック。
  5. 右側に「選択したスコープの更新」が表示されるので、一覧表にある該当ツールにチェックを入れる、あるいは下の方にある「手動でスコープを追加」という入力欄に、GASプロジェクトが必要とするスコープURLを一つずつ正確に入力し、入力するたびに「テーブルに追加」ボタンをクリックします。(今回、GoogleスプレッドシートとGoogleカレンダーの連携に必要なスコープは以下の2つです。)
    * https://www.googleapis.com/auth/spreadsheets
    * https://www.googleapis.com/auth/calendar
  6. 必要なスコープをすべて追加し終えたら、サイドパネルの下部にある「更新」ボタンをクリックします。
  7. 「スコープ」のメイン画面に戻ったら、下のほうにある「Save」ボタンをクリックし、設定を保存しましょう。

4-4. GASのプロジェクト設定画面

GASのプロジェクト「設定画面」(歯車マークのアイコン)に戻ります。
GCPプロジェクトの入力欄にあるGCPプロジェクト番号に、4-1でメモしておいたプロジェクト番号を入力します。(プロジェクトIDではなく、プロジェクト番号を入力しましょう☆)


5. いざ、実行と承認!

いよいよ、作成したGASスクリプトを実行し、Googleからのアクセス許可を与えます。

  1. GASエディタに戻ります。

  2. エディタ上部の関数セレクタが createCalendarEventsFromSpreadsheet になっていることを確認します。

  3. 再生ボタン(▶️)をクリックしてスクリプトを実行します。

  4. **「承認が必要です」**というダイアログが表示されたら、「権限を確認」をクリックします。

  5. 新しいウィンドウで、Googleアカウントを選択する画面が表示されますので、あなたのGoogleアカウントを選択します。

  6. このアプリはGoogleで確認されていません」という警告が表示されます。これは、私たちが設定したアプリが「テスト中」状態であるためです。あなたが作成したアプリなので、心配ありません!

    • 続行」をクリックします。
  7. サンプルがGoogleアカウントへのアクセスをもとめていますの画面に遷移します。アプリが要求している権限(例: 「Googleスプレッドシートの閲覧、編集、作成、削除」や「Googleカレンダーへのアクセス」)が表示されます。内容を確認し、問題なければぞれぞれチェックを入れ「続行」をクリックします。

これでスクリプトが実行される準備が整いました!


6. 動作確認

スクリプトが問題なく動けば、スプレッドシートのA列に「登録済」と表示され、Googleカレンダーにイベントが登録されます。

  1. スプレッドシートに戻り、A列に「登録済」が書き込まれているか確認します。
    • もしエラーメッセージが書かれていたら、その内容を確認してコードやスプレッドシートのデータを修正してみてください。
  2. Googleカレンダーを開き、指定した日時とカレンダーにイベントが追加されているか確認します。

これで、スプレッドシートからのカレンダー登録が自動化できました!


おわりに

GASとGCPの設定は、私のようなプログラム初心者にとってと難しく感じる部分だと思います。私もこの「スコープ」の設定でつまずきました。(だって「スコープって何?」からですもん・・・)

しかし、今回のように一つずつ手順を踏んで設定すれば、個人で使う分にはとりあえず動かすことは可能です。(※不特定多数に公開する場合は、Googleのアプリ検証プロセスを経る必要がありますが、今回は個人利用なので不要です。)

これで、面倒な手作業から解放され、より効率的に作業を進められるようになるはずです。

この情報が、同じように頑張っている誰かの助けになれば幸いです。一緒にGASやGCPの学習、頑張っていきましょう!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?