2016年1月20日水曜日

Google Apps Scriptで管理資料作成の自動化(複数スプレッドシートの情報集計)をやってみる(1/2)

アナタはこんなことで困っている


あなたは、社員の労務管理をしています。社員からは、Excelの月間作業資料を渡されて、中身を確認し、問題なければ確認済みのフォルダに入れています。毎月同じ作業を繰り返していて、社員が増える毎に労務管理作業にかかる時間が増えてきています。
この課題を、Google Apps Scriptで解決できないか、と考えています。

アプローチ方法を考えてみる

Google Apps Scriptで何がやりたいかざっくり考えてみます。

  • いちいち全ての作業報告書を見なくても良いようにしたい。一覧でみたい。
  • 確認済みフォルダに移動することもしたくない
それぞれ、Google Apps Scriptで何ができればよいかを考えてます。

【いちいち全ての作業報告書を見なくても良いようにしたい。一覧でみたい。】
  • 作業報告書スプレッドシートを読み込んで、一覧シートに必要な情報を書き出す
  • 詳細が見たい時に、簡単に見れるようにしたい
【確認済みフォルダに移動することもしたくない】
  • 各人の作業報告書に確認済みなのか、確認未済なのか分かりたい
  • 確認済みになったら決まったフォルダーに自動で移動してほしい
これらができれば、困り事は解決できそうです。

まずは、一覧で見れるようにしてみる

こんな作業報告書スプレッドシートを用意します。

更には、こういうフォルダに社員が作業報告書を入れるとします。


一覧スプレッドシートを作成します。

スプレッドシートを新規作成します。シート名は勤怠管理資料とし(シート名はなんでもよいです)、スクリプトエディタを開きます。
スクリプトエディタの開き方は、「初めてのGoogle Apps Script」に記載しています。

スクリプトを書いていきます。
最初に、完成したソースコードを記載します。スクリプトエディタで全て上書きして下さい。
作業報告書スプレッドシートと報告書が入るフォルダと一覧スプレッドシートがあれば、基本的に動きます。但し、フォルダIDとドキュメントIDを書き換えて下さい。
スクリプトの起動方法は、後述しています。

//作業報告書が入っているフォルダID
var reportsFolder = DriveApp.getFolderById('フォルダIDに書き換える');
//勤怠管理資料のドキュメントID
var ss = SpreadsheetApp.openById('ドキュメントIDに書き換える');
//一覧作成用のスクリプト
function importReport() {
  //作業報告書のデータを読み込む
  //読み込むデータに名前を付ける。後々、一覧シートの項目名となる
  var table = [['所属', '報告日', '管理No', '氏名', '作業内容', '月間作業時間','作業報告書']];
  //作業報告書が入っているフォルダから全てのスプレッドシートを取得する
  var reports = reportsFolder.getFiles();

  //フォルダに入っているスプレッドシートの数だけ繰り返し処理を行う
  for (var i = 1; reports.hasNext(); i++) {
    //データを取得する作業報告書を開く
    var report = reports.next();
    var s = SpreadsheetApp.open(report).getSheets()[0];
 
    //valuesに作業報告書に含まれる全てのデータを格納する
    var values = s.getDataRange().getValues();
 
    //以降、一覧作成に書き込むデータを作業報告書から取得する
 
    //詳細が見たい時に簡単に内容確認できるように作業報告書へのハイパーリンクを作成する
    var link = '=HYPERLINK("' + report.getUrl() +'","作業報告書へのリンク")';
 
    //valuesからセルを指定して作業報告書のデータを取得する
    //セル位置=values[行][列]という意味で、0から始まる数字でセル位置を指定しています。
    //例えば、values[5][0]であれば、values[5]【→6行目】[0]【→A列】=A6の値を取得しなさい、となります。
    table.push([values[5][0], values[4][8], values[6][8], values[13][8], values[11][2], values[48][5], link]);
  }
  //勤怠管理資料に含まれるデータを初期化して全て消す
  var sheet = ss.getActiveSheet()
  sheet.clear({contentsOnly: true});

  //勤怠管理資料にデータを書き込む領域をとります
  //sheet.getRange(開始行, 開始列, 領域を取る行数, 領域を取る列数)
  var range = sheet.getRange(1, 1, table.length, table[0].length);
  //勤怠管理資料にデータを書き込みます
  range.setValues(table);
}


少し解説します


まずは、作業報告書が格納されているフォルダと勤怠管理資料のドキュメントIDを設定です。
それぞれのIDはURLから取得することができます。

・フォルダを開いて、URLの以下の部分がフォルダID


・勤怠管理資料を開いて、URLの以下の部分がドキュメントID

取得したIDで以下を書き換えて下さい。

//作業報告書が入っているフォルダID
var reportsFolder = DriveApp.getFolderById('フォルダIDに書き換える');
//勤怠管理資料のドキュメントID
var ss = SpreadsheetApp.openById('ドキュメントIDに書き換える');


フォルダの中に入っている情報を取得します。


table.push([values[5][0], values[4][8], values[6][8], values[13][8], values[11][2], values[48][5], link]);

作業報告書では情報位置は決まっているので、セル位置を指定してデータを取得しています。
 セル位置=values[行位置][列位置]
となっていて、行位置、列位置は0から始まる数字で位置を表現しています。
行であれば、
0→1行目
1→2行目
・・・

列であれば、
0→A列
1→B列
・・・
となります。
以下のvalues[5][0]であれば、[5]が6行目、[0]がA列を表現していて、A6からデータを取得することを意味しています。

次に一覧シートを書き出します。


  //勤怠管理資料にデータを書き込む領域をとります
  //sheet.getRange(開始行, 開始列, 領域を取る行数, 領域を取る列数)
  var range = sheet.getRange(1, 1, table.length, table[0].length);
  //勤怠管理資料にデータを書き込みます
  range.setValues(table);

スプレッドシートでは、書き込む領域をgetRangeで確保して、その領域に対してsetValueでデータを書き込みます。

最後に、スプレッドシートからスクリプトを動かせるようにします

簡易的に、スプレッドシートからクリックできるボタンを用意します。
スプレッドシートの挿入メニューから図形描画をクリックして、適当な図形をスプレッドシートに挿入します。


ここでは、四角図形を選択して、集計というテキストを入力しています。
挿入した図形を右クリックするとスクリプトを割り当てを選択して、スクリプト名(functionに続く文字列)を記入します。


今回の一覧作成用のスクリプトは以下なので、
 function importReport() {
割り当てるスクリプト名はimportReprt、になります。


スクリプトを起動する際は、集計ボタンをクリックすると起動されます。
うまく起動されると、勤怠管理資料は以下のように作成されます。




今回はここまで

今回は作業報告書を読み込んで勤怠管理資料に一覧を作成するスクリプトを作りました。

次回は以下のやりたいことを実現して、管理資料作成の自動化を完成させます。

【確認済みフォルダに移動することもしたくない】
  • 各人の作業報告書に確認済みなのか、確認未済なのか分かりたい
  • 確認済みになったら決まったフォルダーに自動で移動してほしい




初めてのGoogle Apps Script

準備作業

まず、プログラムを作成する前に、準備作業を行います。
詳しくは、初心者のためのGoogle Apps Scriptプログラミング入力の中でも紹介されています。
今回は抜粋した内容を説明します。


プログラムを書く場所(プロジェクトという)を作る

新規でスプレッドシートを作成します。
作成したスプレッドシートのツールメニューから、スクリプトエディタをクリックします。



そうすると、無題のプロジェクトが作成されます。



function myfunction()の{}の中にプログラムを書いていくことになります。

試しに動かしてみる


以下のソースコードをコピー&ペーストして下さい。
全て選択して、上書きして下さい。


function HelloWorld() {
  Browser.msgBox("Hello World!");
 }


こういう状態になっているはずです。




その状態で、保存(ctrl+S)して下さい。
プロジェクト名を入力して下さい、と聞いてくるので、適当な名前をつけて下さい。

プログラムを実行してみます。
関数リストから「Hello World」を選択し、実行ボタン(▶)をクリックします。
プログラムが実行され、作成したスプレッドシートに「Hello World」と書かれたダイアログが表示されていれば成功です。


これで、プログラムを作成して、実行する準備が整いました。



2016年1月8日金曜日

はじめまして

営業がGoogle Apps Scriptを使って事務担当の困りごとを解決してみる!


こんにちは!
日頃、Google Apps Scriptを使った業務システム提案を行っている営業(私、羽根田)が、目の前にいる事務担当の困りごとをネタにGASやAppsで改善策を定期的に投稿していくブログを始めます。

GASの技術ネタではなく、現実に転がっている業務のあるあるネタに注目して活用事例を紹介していきます。
・いまの時代もうちょっとうまく仕事やれない?と思っている担当者の方
・GoogleApps導入したのに誰も使ってくれないという導入担当者の方

に向けたちょっと楽する/楽させるヒントを提供することを目標にしています。
よろしくお願いします!

はじめに


GASとは何なのか、もしくは、興味は持っているがどうやって始めたらよいか分からない方向けに、スタートアップページを紹介します。

初心者のためのGoogle Apps Scriptプログラミング入力

こちちは、GASってなに?、どうやって始める?という疑問に丁寧に解説してくれています。ざっくり、概要を知りたいかたはどうそ!私も参考にしています。

目の前にいる事務担当の困りごと、とは


このブログで登場する事務担当者(仮に庄司くん、と名づけます)の目標と困りごとをリストアップしていきます。
庄司くんは、突発作業が多い事務業務を「誰でも(標準化)/どこにいても(在宅化)/偏りなく(平準化)」を目指して事務作業を効率的(自動化)にこなす仕組みを考えているエンジニア上がりの意識高い系事務リーダーです。基本的に、タスクをシステムに管理してもらい、自分たちは目の前の仕事に集中できるようにしたいと思っています。

彼の困り事は、

  • 管理資料作成の自動化(複数スプレッドシートの情報集計) 
  • 集計作業の自動化(複数スプレッドシートの結合) 
  • 仕事依頼の平準化(フォルダ追加通知) 
  • 書類作成の自動化(情報の一元管理、差込印刷) 
  • 雑多な問い合わせ対応の工数削減(Docの目次リンクでマニュアル化) 
  • 作業漏れの防止(作業リストのカレンダー一括登録、リマインド機能) 
  • 複雑な分析資料作成の自動化 
  • 催促作業の自動化(特定のスケジュールに予定追加) 

などなど。それぞれ、解決していく様子をブログ形式でお伝えします。