【豆知識】Googleスプレッドシートを使ってGoogleカレンダーに予定をワンクリックで追加・削除する方法【第二弾】

作業効率化
この記事は約17分で読めます。

前回はGoogleカレンダーにGoogleスプレッドシートで書いた予定を追加・登録するということを紹介いたしました。

今回はその第二弾!

Googleカレンダーに日々の予定を一括で追加、削除できたら便利ですよね。
手間のかかる作業とはおさらば!Googleスプレッドシートを使って日々の予定を一括でワンクリックで追加・削除する方法について解説していきたいと思います。

最近、第三弾も書かせていただきました。よろしくお願いいたします

スポンサーリンク

Google スプレッドシートを開く

Googleのサイトを開き、右上の3つの「」をクリックして、下にスクロールして出てくる「スプレッドシート」を選択します。

スプレッドシートを開いて、「空白のスプレッドシート」を作成します。

新しいスプレッドシートが開けました。

表を作る

まず表を作成します。まずタイトルを付けます。「カレンダー追加・削除用」とでもしましょう。次にシート名も変更しておきます。わかりやすく「カレンダー」とでも付けておくとよいでしょう。行番号と列番号に気をつけて表を作成してください。カレンダーを登録するユーザーの「メールアドレス」も登録します。メールアドレスは「B列7行目」に記述するようにしてください。「9行目」に「連携」「日付」「曜日」「開始時間」「終了時間」「タイトル」「場所」「説明」の項目を作り、幅や色、枠線などを付けて成形します。

拡張機能を使ってプログラムを組み込む

メインプログラム

拡張機能」>「Apps Script」を開きます。

無題のプロジェクト」が開きます。タイトルを変更して「カレンダー追加・削除用マクロ」とでもしておいてください。

次の文章をコピペします。(バグ修正等の情報はこちら

/**
 * 予定を作成する
 */
function createSchedule() {

  // 初期設定
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName('カレンダー');

  // 連携するアカウント
  let i;

  const range = sheet.getRange("B7");  // シート:B7 の範囲を取得する
  const gAccount = range.getValue();   // 取得したシートからメールアドレスを取得する

  // 読み取り範囲(表の始まり行と終わり列)
  const topRow = 10;  // 10行目が開始行
  const lastCol = 9;  // 9列目まで読み取る

  // 0始まりで列を指定しておく
  const statusCellNum = 1;
  const dayCellNum = 2;
  const startCellNum = 4;
  const endCellNum = 5;
  const titleCellNum = 6;
  const locationCellNum = 7;
  const descriptionCellNum = 8;

  // 予定の最終行を取得
  let lastRow = sheet.getLastRow();
  
  //予定の一覧を取得
  let contents = sheet.getRange(topRow, 1, sheet.getLastRow(), lastCol).getValues();

  // googleカレンダーの取得
  let calendar = CalendarApp.getCalendarById(gAccount);

  //順に予定を作成(今回は正しい値が来ることを想定)
  for (i = 0; i <= lastRow - topRow; i++) {

    //「済」または「空白」の場合は飛ばす
    let status = contents[i][statusCellNum];
    if (
      status == "済" ||
      status == "済み" ||
      contents[i][dayCellNum] == ""
    ) {
      continue;
    }

    // 値をセット 日時はフォーマットして保持
    let day = new Date(contents[i][dayCellNum]);
    let startTime = contents[i][startCellNum];
    let endTime = contents[i][endCellNum];
    let title = contents[i][titleCellNum];

    // 場所と詳細をセット
    let options = {location: contents[i][locationCellNum], description: contents[i][descriptionCellNum]};
    
    try {
      // 開始終了が無ければ終日で設定
      if (title == '' || startTime == '' || endTime == '') {
        //予定を作成
        calendar.createAllDayEvent(
          title,
          new Date(day),
          options
        );
        
      // 開始終了時間があれば範囲で設定
      } else {
        // 開始日時をフォーマット
        let startDate = new Date(day);
        startDate.setHours(startTime.getHours());
        startDate.setMinutes(startTime.getMinutes());

        // 終了日時をフォーマット
        let endDate = new Date(day);
        endDate.setHours(endTime.getHours());
        endDate.setMinutes(endTime.getMinutes());

        // 予定を作成
        calendar.createEvent(
          title,
          startDate,
          endDate,
          options
        );
      }

      //無事に予定が作成されたら「済」にする
      sheet.getRange(topRow + i, 2).setValue("済");

    // エラーの場合(ログ出力のみ)
    } catch(e) {
      Logger.log(e);
    }
  }

  // ブラウザへ完了通知
  Browser.msgBox("追加完了");
}

/**
 * 予定を削除する
 */
function deleteSchedule() {

  // 初期設定
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName('カレンダー');
  let i;
  let j;

  // 連携するアカウント
  const range = sheet.getRange("B7");  // シート:B7 の範囲を取得する
  const gAccount = range.getValue();   // 取得したシートからメールアドレスを取得する

  // 読み取り範囲(表の始まり行と終わり列)
  const topRow = 10;  // 10行目が開始行
  const lastCol = 7;  // 7列目まで読み取る

  // 0始まりで列を指定しておく
  const statusCellNum = 1;
  const dayCellNum = 2;
  const startCellNum = 4;
  const endCellNum = 5;
  const titleCellNum = 6;

  // 予定の最終行を取得
  let lastRow = sheet.getLastRow();
  
  //予定の一覧を取得
  let contents = sheet.getRange(topRow, 1, sheet.getLastRow(), lastCol).getValues();

  // googleカレンダーの取得
  let calendar = CalendarApp.getCalendarById(gAccount);

  //順に予定を作成(今回は正しい値が来ることを想定)
  for (i = 0; i <= lastRow - topRow; i++) {

    //「済」または「空白」の場合は飛ばす
    let status = contents[i][statusCellNum];
    if (
      status == "済" ||
      status == "済み" ||
      contents[i][dayCellNum] == ""
    ) {
      continue;
    }

    // 値をセット 日時はフォーマットして保持
    let day = new Date(contents[i][dayCellNum]);
    let startTime = contents[i][startCellNum];
    let endTime = contents[i][endCellNum];
    let title = contents[i][titleCellNum];

    startTime = timeFormatter(startTime);
    endTime = timeFormatter(endTime);
    let eventStartTime;
    let eventEndTime;

    try {
      //予定を作成
      event = calendar.getEventsForDay(
        new Date(day)
      );

      for (j = 0; j < event.length; j++) {
        // 開始終了が無ければ終日で設定
        if (title == event[j].getTitle() && startTime == '00:00' && endTime == '00:00') {
          event[j].deleteEvent();

          //無事に予定が作成されたら「済」にする
          sheet.getRange(topRow + i, 2).setValue("済");

        } else if (title == event[j].getTitle()) {
          eventStartTime = timeFormatter(event[j].getStartTime());
          eventEndTime = timeFormatter(event[j].getEndTime());

          if ((eventStartTime == startTime && eventEndTime == endTime) || eventStartTime == startTime || eventEndTime == endTime) {
            event[j].deleteEvent();

            //無事に予定が作成されたら「済」にする
            sheet.getRange(topRow + i, 2).setValue("済");
          }
        }
      }
    // エラーの場合(ログ出力のみ)
    } catch(e) {
      Logger.log(e);
    }
  }

  // ブラウザへ完了通知
  Browser.msgBox("削除完了");
}

function timeFormatter(date){
  let new_date;

  if(date != '') {
    new_date = Utilities.formatDate(new Date(date),'JST','HH:mm');
  } else {
    new_date = '00:00';
  }
  return new_date;
}

コピペし終わったら、「プロジェクトを保存」しておきます。

jsonファイルの設定

次に、Googleカレンダーへの実行権限を許可するためにjsonファイルの編集を行います。jsonファイルを編集するには、下図の左にある設定歯車ボタンをクリックして、「appsscript.json」マニフェスト ファイルをエディタで表示するにチェックを入れます。

そして、以下の文章をappsscript.jsonsに書き込みます。appsscript.jsonsファイルは、<>をクリックしたところにあります。

{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",

  "oauthScopes": [
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/forms",
    "https://www.googleapis.com/auth/calendar"
 ]
}

コピペが終わったら、保存をしておいてください。

実行用のボタンを設置する(追加・削除)

ボタンを作成する

まず実行用のボタンを作成します。メニューバーの「挿入」>「図形描画」をクリックします。

図形」「テキストボックス」を駆使して、「追加」「削除」の実行ボタンを作成します。作成が終わったら、「保存して終了」をクリックします。※ご自身でわかればいいので、どんなボタンでも構いません。

ボタンを設置する

保存して終了」をクリックすると、自動で表にボタンが設置されますので、クリックしやすい位置に場所を移動し、大きさも調整してください。

ボタンにマクロを追加する(追加用マクロ)

実行ボタンの右上に縦に「」マークがあるのがわかるかと思います。

」マークをクリックし、「スクリプトを割り当て」をクリックします。

スクリプトを割り当てる画面になりますので、「createSchedule」と入力して「確定」をクリックしてください。

これで追加用の実行ボタンの設置ができました。※一度マクロを登録した実行用ボタンを移動したい場合は、CTRLを押しながらボタンをクリックすることで移動可能になります。

ボタンにマクロを追加する(削除用マクロ)

実行ボタンの右上に縦に「」マークがあるのがわかるかと思います。

」マークをクリックし、「スクリプトを割り当て」をクリックします。

スクリプトを割り当てる画面になりますので、「deleteSchedule」と入力して「確定」をクリックしてください。

これで削除用の実行ボタンの設置ができました。※一度マクロを登録した実行用ボタンを移動したい場合は、CTRLを押しながらボタンをクリックすることで移動可能になります。

ワンクリックで予定を組み込んでみる(初回だけの手順)

適当でも実務的でも良いので予定を記入してから、どちらでも良いので実行ボタンをクリックしてください。すると次のような許可画面が出ると思いますので、「OK」をクリックします。

次にアカウントの選択画面になりますので、アカウントを選択します。

すると次のような警告が出ますが、このプログラムをGoogleに登録をしているわけではない為、警告が出るのは当たり前なので、ここは無視して「詳細」をクリックします。

下に表示されるリンクの「カレンダー追加・更新用マクロ(安全ではないページ)に移動」をクリックします。

作成したマクロ「Google Apps Script(GAS)」を登録するので「許可」をクリックします。

このような面倒な許可が必要なのは一度目だけです。二度目以降は面倒な手続きはないので安心してください。

ワンクリックで予定を追加してみる

適当にデータを入れて登録をしてみます。

実行ボタンの「追加」ボタンをクリックすると、以下のような画面が出て、Google カレンダーに予定が組み込まれます。

Google カレンダーを見てみると、予定が反映されていることが確認できました。

ワンクリックで予定を削除してみる

先程登録したデータを利用します。「連携」の部分に「」という文字が入っていると思います。「」という文字を消してから、「削除」の実行ボタンを押します。

実行ボタンの「削除」ボタンをクリックすると、以下のような画面が出て、Google カレンダーから予定が削除されます。

Google カレンダーを見てみると、予定が削除されていることが確認できました。

バグ対応・バージョンアップ

  • 2024/09/14 19:38修正 varをletとconstに変更。その他改善。
  • 2024/09/24 22:24修正 削除で日付指定のときに削除が上手くいかないのを修正。暫定版。

最後に

いかがでしたでしょうか?
表に書いてある日程でしか追加と削除はできませんが、ひとつずつ追加・削除を行うよりは遥かに楽に作業ができるようになったのではないでしょうか?

ちなみに表の横の行は無限に登録することができますが、管理しやすい範囲での作成をオススメいたします。(動作が劇的に遅くなるということではありません)
便利ですので、使用していただけると幸いです。

謎爺
謎爺

以下、この記事を書くにあたり、参考にしたサイトじゃ。

参考サイト

GASでGoogleカレンダーの予定を変更・削除する方法!件名や開始日・終了日(時間)を修正 | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門
Googleカレンダーの予定をすべてGASで削除する方法 | iwb.jp
Google Apps ScriptからGoogleカレンダーを削除する方法 | Kokoroe
スプレッドシートからGoogleカレンダーに予定を登録する方法(GAS) | Googleスプレッドシート 完全攻略
スプレッドシートからGoogleカレンダーに簡単に予定を登録する方法(初心者向け) | Googleスプレッドシート 完全攻略
スプレッドシートからカレンダーに連携してスケジュールを一括登録する【Google Apps Script(GAS)】 | 大阪のシステム開発なら 株式会社ウィズテクノロジー
【GAS】スプレッドシートに記載した予定をGoogleカレンダーにまとめて反映させたい #GAS - Qiita
GAS実行ユーザーのメールアドレス(Googleアカウント)を取得する方法 | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門
【Google Apps Script入門】セルの取得・変更をする | UX MILK
【GAS入門】変数/定数を宣言するvar・const・letの違い | Log Stocker
Googleスプレッドシートのスクリプト実行方法とボタンの実行方法 – Google Apps Script(GAS)を用いたシステム開発を支援
GASの配列の要素数(長さ)を取得する方法(lengthプロパティ) | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門
[GAS]Googleフォームで入力した時刻をスプレッドシートから取得したら1899/12/30になってしまう話 | たいぼんの社内SE blog
GoogleAppsScriptでGoogleカレンダーの予定をチャットワークに通知するやつ作る【GAS初心者向け】 #Chatwork - Qiita
【GAS】UtilitiesクラスのformatDate()メソッドで日付オブジェクトを文字列に変換する | EGUWEB(エグウェブ)
GASでGoogleCalendarにあっさりアクセス

コメント

  1. りり より:

    こちらのマクロを非常に重宝させていただいております。
    1点ご質問がございます。こちらのマクロを使用し予定を削除する際に、表に記載していない「終日予定」の方を優先して削除されてしまうのですが、対処方法はございますでしょうか。削除したい予定は「終日」ではなく「時間指定」しています。
    もしご覧いただけておりましたら、ご回答いただけますと幸いです。

    • 白川秋 白川秋 より:

      りり様
      ご指摘いただき、ありがとうございます。
      ご指摘の件ですが、
      //予定を作成
      event = calendar.getEventsForDay(
      new Date(day)
      );
      event[0].deleteEvent();
      というプログラムになっており、現在は終日分削除というざっくりした作りとなっております。
      これは第一弾から引き継がれており、私の不手際でもあります。
      時間が空いた際に、修正させていただきますので、それまでお待ちいただけると幸いです。

      よろしくお願いいたします。

    • 白川秋 白川秋 より:

      りり様
      バグ対応させていただきました。
      思ったよりも、工数がかかり、時間もかかりましたが、恐らくはこれで動くのではないかと思います。

      よろしくお願いいたします。

タイトルとURLをコピーしました