GAS(カレンダーの予定をシートに出力)

GAS

リモートになって、業務日報の記載が面倒だ。

カレンダーは、会議予約くらいしか使っていないよ。
何かと稼働時間の報告があるから、なんかいい方法ないかな。

リモートワークが始まり、業務日報を作成している会社が増えているそうです。(*1)
*1「日報制度や日々の業務報告を規則として導入しているか」という問に68.7%の回答がはい。(株式会社gamba調べ)

業務の報告として、稼働実績の報告が発生していませんか?実績の報告は、プロジェクト毎の活動時間報告など、いろんなところで発生しますよね。それに加えて、1日の業務日報を毎日提出するとなると、何とかしたいと思っていました。

私は解決策として、自分の活動実績を全部グーグルカレンダーに登録することにしています。
終業時にスプレッドシートに出力することで、報告ごとの集計が楽に行えています。
カレンダーや日報登録など、2重入力をしている方のヒントになれば幸いです。

本記事の内容

今回の仕組みについて説明します
今回のサンプルプログラム
GASを使用した効率化を進めてみませんか

今回の仕組みについて説明します

今回の仕組みは、カレンダーの予定をスプレッドシートに出力する単純な構造です。冒頭お話しした、いろいろな報告様式に加工することまではできません。
しかし、一日もしくは複数日の稼働実績をデータとして扱えるだけでも、報告時に楽になります。

実行手順は以下のようなものです。

1.スプレッドシートの検索条件を入力して、GASを実行する。(日付やキーワード)

検索条件シートの左側の検索条件「カレンダーID、取り出したい日付の開始終了、検索文字、出力項目」を入力します。
条件入力が終わりましたら、
上段のメニューバー右端より「GAS実行>カレンダー出力」をクリックすると、カレンダーの出力が開始されます。

2.スプレッドシートの出力シートにカレンダの1マスが1行の形式で出力される。

画面上に一瞬「スクリプトが終了しました」と表示されれば、動作は正常です。

結果は、出力結果シートに予定が取り出せます。

サンプルは以下のリンクを参照ください。
皆さんのマイドライブにコピーして動作の確認をお願いします。
/*******************************************************************************************
  処理:起動時に、GASの実行メニューを追加する
*******************************************************************************************/
function onOpen(){

  //メニュー一覧の作成
  var myMenu=[
       {name: "カレンダー出力", functionName: "outputCalendar"}
  ];

  SpreadsheetApp.getActiveSpreadsheet().addMenu("GAS実行",myMenu); //メニューを追加

}

/*******************************************************************************************
  処理:カレンダーの予定を抽出して、シートに出力する
*******************************************************************************************/
function outputCalendar() {
/*-----------------------------------------------------------------------------------------
  初期処理
  設定シートの取得、設定値の取得、出力設定の取得 (スプレッドシートの値をGASで使えるようにする)
------------------------------------------------------------------------------------------*/
 // 設定シートの取得
 const spreadSheet     = SpreadsheetApp.getActiveSpreadsheet();
 const sheetParameter  = spreadSheet.getSheetByName("検索条件");

 // 設定値の取得
  var iRowNo = 6;      // 設定値の先頭行が6行目
  var iColNo = 15;     // 設定値の列Oは、15番目
  
  const P_calendarId      = sheetParameter.getRange(iRowNo, iColNo).getValue();               // カレンダーID
  const P_startDate       = new Date  (sheetParameter.getRange(++iRowNo, iColNo).getValue()); // 取得開始日
  const P_endDate         = new Date  (sheetParameter.getRange(++iRowNo, iColNo).getValue()); // 取得終了日
  const P_reExclusion     = new RegExp(sheetParameter.getRange(++iRowNo, iColNo).getValue()); // 除外ワード
  
  // 出力設定の取得
  const P_OutputStartDate   = sheetParameter.getRange(++iRowNo, iColNo).getValue(); // 開始日時
  const P_OutputEndDate     = sheetParameter.getRange(++iRowNo, iColNo).getValue(); // 終了日時
  const P_OutputTitle       = sheetParameter.getRange(++iRowNo, iColNo).getValue(); // タイトル
  const P_OutputExplanation = sheetParameter.getRange(++iRowNo, iColNo).getValue(); // 説明
  const P_OutputParticipant = sheetParameter.getRange(++iRowNo, iColNo).getValue(); // 参加者
  const P_OutputPlace       = sheetParameter.getRange(++iRowNo, iColNo).getValue(); // 場所
  const P_OutputSheetname   = sheetParameter.getRange(++iRowNo, iColNo).getValue(); // 出力シート名
  const sheetOutput         = spreadSheet.getSheetByName(P_OutputSheetname);   // 出力シート

/*-----------------------------------------------------------------------------------------
  抽出処理
  カレンダーへのアクセス、出力条件指定 (カレンダーの予定をGASで使えるようにする)
------------------------------------------------------------------------------------------*/
  //カレンダーのアクセス(getEvents)時に、開始日と終了日を設定して実行する。
  var calendar = CalendarApp.getCalendarById(P_calendarId);
  var events = calendar.getEvents(P_startDate, P_endDate);

/*-----------------------------------------------------------------------------------------
  出力処理
  タイトルの作成、カレンダーの予定をスプレッドシートへ転記
------------------------------------------------------------------------------------------*/
  // シートの初期化
  sheetOutput.clearContents();

  // タイトルの作成
  iRowNo = 1;      // 出力値の先頭行が1行目
  iColNo = 1;      // 出力値の先頭列が1列目
  
  if (P_OutputStartDate     == '1') {
    sheetOutput.getRange(iRowNo,iColNo).setValue('開始時間');  // 開始日時
    iColNo++;
  } 
  if (P_OutputEndDate       == '1') {
    sheetOutput.getRange(iRowNo,iColNo).setValue('終了日時');  // 終了日時
    iColNo++;
  } 
  if (P_OutputTitle         == '1') {
    sheetOutput.getRange(iRowNo,iColNo).setValue('タイトル');  // タイトル
    iColNo++;
  } 
  if (P_OutputExplanation   == '1') {
    sheetOutput.getRange(iRowNo,iColNo).setValue('説明');     // 説明
    iColNo++;
  } 
  if (P_OutputParticipant   == '1') {
    sheetOutput.getRange(iRowNo,iColNo).setValue('参加者');   // 参加者
    iColNo++;
  } 
  if (P_OutputPlace         == '1') {
    sheetOutput.getRange(iRowNo,iColNo).setValue('場所');     // 場所
    iColNo++;
  } 

  // カレンダーの予定をスプレッドシートへ転記
  iRowNo = 2;   // 出力値の先頭行が2行目
  for(let event of events){

    if (P_reExclusion.test(event.getTitle())==false) continue;             // 検索文字が含まれていたら次のイベントへ

    iColNo = 1;   // 出力値の先頭列が1列目  
    if (P_OutputStartDate     == '1') {
      sheetOutput.getRange(iRowNo,iColNo).setValue(event.getStartTime());  // 開始日時
      iColNo++;
    } 
    if (P_OutputEndDate       == '1') {
      sheetOutput.getRange(iRowNo,iColNo).setValue(event.getEndTime());    // 終了日時
      iColNo++;
    } 
    if (P_OutputTitle         == '1') {
      sheetOutput.getRange(iRowNo,iColNo).setValue(event.getTitle());      // タイトル
      iColNo++;
    } 
    if (P_OutputExplanation   == '1') {
      sheetOutput.getRange(iRowNo,iColNo).setValue(event.getDescription()); // 説明
      iColNo++;
    } 
    if (P_OutputParticipant   == '1') {
      sheetOutput.getRange(iRowNo,iColNo).setValue(event.getCreators());    // 参加者  
      iColNo++;
    } 
    if (P_OutputPlace         == '1') {
      sheetOutput.getRange(iRowNo,iColNo).setValue(event.getLocation());    // 場所 
      iColNo++;
    } 
   iRowNo++;
  }
}

GASを使用した効率化を進めてみませんか

今回は単純なカレンダーの出力ですが、このような単純なことでも省力化を重ねていくことで、自分の時間を有意義なものに使用できるようになると思います。
まずは、GASの文法がわからなくても、ネットのサンプルを動かしてみて、業務の自動化を少しずつでも体験していきましょう。

今回は以上です。

コメント