見出し画像

日報作成を自動化して定時退勤しよう【GASでRPA】

日報の作成に時間をかけず、楽にハイクオリティなものを仕上げたいな〜。

そんな感じの願望を、いくらか叶えてくれる方法があります。

一日の予定をGoogleカレンダーから取得して日報化するプログラムを、誰でも作れるくらい丁寧にご紹介します。

コピー用の列を選択してコピペできます

用意するもの

  • Googleアカウント(または組織のメールアドレス)

  • 業務スケジュールが登録されたGoogleカレンダー

できること

  • カレンダーから、1日のスケジュールを日報にコピペできる形に変換する

  • 日数を入力することで、手軽に前後の日付分を出力するよう指定できる

  • いつのスケジュールなのか、日付を表示

  • お互いにカレンダーを覗ける設定(社内アカウント同士など)なら、作成済みシートにアクセスするだけで、アクセスしたユーザーの予定が出力できる

準備

こちらのGoogleスプレッドシートを複製してください。

シートの複製方法

[ファイル] > [コピーを作成]

コード

[拡張機能] > [Apps Script] を開きます。
うまく開けない場合は、シークレットモードで試してみてください。

上の画面が開いたら、最初から入力されている

function myFunction() {
}

というテキストを全て消してから、以下のコードをコピペしてください。

const CALENDAR_ID = Session.getActiveUser().getEmail();

function onOpen() {
  const ui = SpreadsheetApp.getUi();
  const menu = ui.createMenu('▶︎日報更新');
  menu.addItem('更新する', 'getCalendarEvents');
  menu.addToUi();
}

function getCalendarEvents() {
  const calendar = CalendarApp.getCalendarById(CALENDAR_ID);  
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  var currentDateTime = new Date();
  
  const lastRow = sheet.getLastRow();

  sheet.getRange(1,4).clearContent();
  sheet.getRange(2,2,lastRow,4).clearContent();

  currentDateTime.setHours(00);
  currentDateTime.setMinutes(00);
  currentDateTime.setSeconds(00);

  var shiftDate = sheet.getRange('A1').getValue();

  if (shiftDate >= 0){
    currentDateTime.setDate(currentDateTime.getDate() + shiftDate);
    }else{
    var abs_shiftDate = Math.abs(shiftDate);
    currentDateTime.setDate(currentDateTime.getDate() - abs_shiftDate);
  }
    
  var startTime = new Date(currentDateTime);
  currentDateTime.setHours(23);
  currentDateTime.setMinutes(59);
  currentDateTime.setSeconds(59);
  var endTime = new Date(currentDateTime);

  var lastEvent = calendar.getEvents(startTime, endTime);
 
  var values = [];
    for(var firstEvent of lastEvent){
      var eventTitle = firstEvent.getTitle();
      var eventStartTime = firstEvent.getStartTime();
      var eventStartTime = Utilities.formatDate(eventStartTime, 'Asia/Tokyo', 'HH:mm');
      var eventEndTime = firstEvent.getEndTime();
      var eventEndTime = Utilities.formatDate(eventEndTime, 'Asia/Tokyo', 'HH:mm');
      var contentsForCopy = eventStartTime + '~' +eventEndTime  + '|' +  eventTitle;

    var record = [
      eventStartTime,
      eventEndTime,
      eventTitle,
      contentsForCopy.replace(/00:00~00:00/,'【全日】')
    ];
    values.push(record);
  }

  if(values.length) {sheet.getRange(2, 2, values.length, values[0].length).setValues(values);}
  sheet.getRange(1,4).setValue(startTime);
}

コピペが完了したら、[▶︎ 実行]というボタンの左にある保存ボタンをクリックして保存してください。

設定

初回実行設定

[▶︎ 実行] ボタンをクリックします。

少し待つとこのようなポップアップが表示されるので、手順通りに進めます。見慣れない表示かもしれませんが、この手順が公式ルートです。

画像下のキャプションにしたがって、承認を行なってください。

①「権限を確認」をクリック
② アカウントを選択
③「詳細」をクリック
④「プロジェクト名(安全ではないページ)に移動」をクリック
⑤「許可」をクリック
⑥この画面に戻ってきて完了


実行トリガーの設定

起動時トリガーと、編集時トリガーを設定しておくと便利です。

  1. 画面左のバーから時計のアイコンをクリックして「トリガー」設定画面を開きます

  2. 右下の [+ トリガーを追加] をクリックします

  3. [イベントの種類を選択] から「起動時」を選択して、保存します

  4. もう一度、右下の [+ トリガーを追加] を開きます

  5. [イベントの種類を選択] から「編集時」を選択して、保存します

これで、スプレッドシートを開いたタイミングと、シートに変更を加えたタイミングで、最新のスケジュールが読み込まれます。

使い方

指定日の予定を出力

左上の黒いA1セルに入力した日数分、前後の日付の予定を出力できます。

0:±0状態なので、当日を指定しています。
   基本はこれで問題ないです。

1:+1状態で、次の日が指定されています。
   プラス記号は省略されます。

-1:-1状態で、前日が指定されています。
     マイナス記号も入力してください。

実行トリガーで「編集時」がセットされていれば、日付の指定を編集するだけで指定日のスケジュールに自動更新されます。

手動更新

スプレッドシートのツールバーにある [▶️ 日報更新] をクリックすると、日付の指定を変えたりせずに、最新のスケジュールに更新できます。

その他の仕様

取得するカレンダーは、スプレッドシートを開いているアカウントのメールアドレスから取得しています。

複数人で共有して使うと、それぞれのカレンダーの中身が混ざります。使いまわせる点としては、便利かもしれません。

固定のメールアドレスを使いたい場合、コードの一行目を以下に書き換えてください。

const CALENDAR_ID = "xxxxxxx@gmail.com";

Googleカレンダーが使えているアカウントなら、組織ドメインのメールアドレスでも大丈夫です。


参考になれば、スキ♥️ 押してくださると嬉しいです!

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