見出し画像

Googleカレンダーのみんなの予定を確認する

はじめに

パートの登録者に仕事の割り振りがうまくできなくて困っているという悩みを聞きました。人数も仕事も少なかった時代のパートに個々に確認を取って割り振りをするという方法でやっているとのこと。今はパート登録者が100人近くに増えているので、このやり方では限界が来ているといっておりました。

結局その仕事に慣れている人に仕事を割り振ってしまい、古くからの方からは減らしてほしいといわれ、新しく登録したパートの方には仕事が回らず、登録したけど仕事がなかなか回ってこないということになっています。

登録者ひとりひとりに「この日のこの時間に仕事に入ることができますか?」と、いちいち問い合わせをせずに確認するには、予め予定を入れておいてもらいそれを調べるというのが良い解決方法でしょう。Googleカレンダーを使って調べられるようにします。

仕様

  1. パート登録者にGoogleカレンダーを作成してもらう

  2. 管理者のGoogleカレンダーからパート登録者のカレンダーにアクセスできるように設定する

  3. プログラムでパート登録者全員のカレンダーを読み込む

  4. 仕事の割振りは次回以降です...

動かしてみる

先ずパートの登録者にGoogleカレンダーを作成してもらいます。そしてカレンダーに仕事に入ることができない時間帯をカレンダーに予定として入力してもらうことにします。必ず予定を入力してもらうというのが運用のルールです。

次に登録者のカレンダーを管理者のGoogleアカウントからアクセスできるように設定していきます。パートの方は自分のGoogleカレンダーの設定を開いて、マイカレンダーの設定→カレンダーの設定→特定のユーザーまたはグループと共有するの項目に行きます。+ ユーザーやグループを追加のボタンで管理者のGoogleメールアドレスを追加します。Gmail のアドレスが追加されると右下にある送信の文字色が青色になります。これで有効になったので、送信を選択してメールを管理者に送ります。

Googleカレンダー共有の手順

送信処理がなされると、管理者にはカレンダーを共有してくれた方からメールが届きます。メールには「このカレンダーを追加」というリンクが付いています。

共有連絡メールのカレンダー追加のリンク

このカレンダーを追加のリンクを開くとクリックすると、Googleカレンダーが開いて、そこにカレンダーを追加というメッセージボックスが出ます。追加を選択すると、Googleカレンダーの「他のカレンダー」に登録者のカレンダーが追加されます。面倒なのですがパートの登録者全員のカレンダーを読み込むために、これを全員とやります。

追加ボタンで管理者のカレンダーに追加される

カレンダーが追加され、他のカレンダーにチェックを付けて同時に開くと下の図のようになります。色分け(水色、紫色、小豆色)されていて、誰の予定なのかが分かるようになっています。

追加されたカレンダーの同時表示

パート登録者のカレンダーが管理者のカレンダーに共有ができたので、管理者のアカウントでカレンダーの情報を読み込むためのスクリプトを作成します。前準備としてGoogle SpreadSheet に「予定一覧」シートと「アカウント一覧」シートを作成し、カレンダー共有のメールが届いた人のメールアドレスをGoogle SpreadSheet の「アカウント一覧」シートに入力します。

アカウント一覧

「予定一覧」シート上にボタンを作って、メニューの[拡張機能]から[Apps Script]を選んでApps Scriptエディタを開きgenerateEventList関数を作成してボタンに割り付けます。
generateEventList関数は、アカウント一覧シートのアカウントを読み取り、各アカウントのカレンダーから開始日と終了日の間のイベント(予定)を取り出して書き出します。イベントの件名が取り出せない設定になっているカレンダーでは「不明」とします。日付と開始時間、終了時間を一緒に取り出して書き出します。今回は3人のカレンダーから予定を取り出して書き出しました。

3人のカレンダーからイベントを取り出して書き出す

作成した関数です。

function generateEventList() {
  // スプレッドシートの指定
  let sheetId = '*************'; // スプレッドシートのID(URLに含まれる)を指定
  let sheetNameAccount = 'アカウント一覧';
  let sheetNameTarget = '予定一覧';
  let spreadsheet = SpreadsheetApp.openById(sheetId);
  let sheetAccount = spreadsheet.getSheetByName(sheetNameAccount); 
  let sheetTarget = spreadsheet.getSheetByName(sheetNameTarget); 

  // 開始日と終了日を取得する
  let startDate = new Date((sheetTarget.getRange("H6")).getValue());
  let endDate = new Date((sheetTarget.getRange("H7")).getValue());

  // アカウント一覧シートを読んでアカウントの配列を作成する
  let accountArray = new Array();
  for(let i=2;i<sheetAccount.getLastRow()+1;i++){
    account = (sheetAccount.getRange(i,1)).getValue();
    accountArray.push(account);
  }

  // アカウントそれぞれについてカレンダーのイベントを取得して予定一覧シートに書き出す
  let title = '';
  let row_no = 2;
  for(let account of accountArray){
    let calendar = CalendarApp.getCalendarById(account);
    if (calendar) {
      console.log("Name:" + calendar.getName());
      let events = calendar.getEvents(startDate, endDate);
      for(let event of events){
        Logger.log(event.getTitle());// タイトル
        if(event.getTitle()==''){title='不明'}else{title=event.getTitle()}
          let newRow = [
            account,
            title,
            event.getStartTime().toLocaleString('ja-JP', {year: 'numeric', month: 'numeric', day: 'numeric'}),
            event.getStartTime().toLocaleString('ja-JP', {hour: 'numeric', minute: 'numeric'}),
            event.getEndTime().toLocaleString('ja-JP', {hour: 'numeric', minute: 'numeric'})
          ];
        
        (sheetTarget.getRange(row_no, 1, 1, 5)).setValues([newRow]); // セットする配列は一行であっても二次元配列にする
        row_no++;
      }
    } else {
      Logger.log("カレンダーが見つかりません。IDや共有設定を確認してください。");
    }
  }
}

技術情報

スクリプト:Google Apps Script
その他:Googleカレンダー、Google SpreadSheet

まとめ

登録者が100人いて、100人から人を選んで仕事のスケジュールを電話やメール、LINEなどで個々に調整していく仕事はぜひともプログラムに任せた方がいいです。これから仕事の割り振りをする仕組みを作っていきます。

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