この物語は、入社して一年目の新人社員が上司の指南のもと、業務を自動化していく様を記したものです。物語はフィクションですが、自動化の手法は実際にパソコンやスマートフォンで実践できるものですので、物語と自動化作業の両方を楽しめます(前回のストーリーはこちら)。
そして、今回の舞台はいつもの職場から少し離れたランニングコースから始まります。
笑顔で楽しそうに走っているのは、僕と太田先輩。・・・だけではなく、太田先輩に惚れている佐藤先輩をはじめ、部署の同僚たち。というのも、仕事終わりに太田先輩が「たまには運動したいな」と呟いたことから始まった。僕は「良いですね。良いランニングコースを探してみます」と返すと、聞き耳を立てていた佐藤先輩が自分も行くと言いだし、それに続いて部署の面々が参加することになったのだ。
よく漫画で、主人公が職場の同僚たちと仲良く遊びに行くというシチュエーションがあるけど、こんな感じで話がパパッと進んでいくことから見ても、この職場の雰囲気が良いことは一目瞭然だ。みんな仲が良いので、僕もすぐ会社に溶け込むことができた。
僕たちは公園に集まって走り出した。そして、自然と僕を含む20代メンバーが先頭になる。もともと、それほど真剣に走るわけではないので、先頭チームは冗談を言い合いながら走っていた。そんな時、太田先輩が思い出したように言い出した。
「そうだ。そういえば、月末に毎月作ってる社内の予定表あるでしょう?あれをGoogleカレンダーに入れてみんなで共有したいって社長から言われたの。」
僕は笑顔で答えた。
「良いですね。毎回、予定表確認するの面倒だと思っていました。」
太田先輩は笑顔で言った。
「それは良かった。予定表をカレンダーに登録するの、田中君の担当ね。」
「あ、なるほど、了解です」と答えた僕の笑顔は少し引きつったかもしれない。今でも毎月の仕事量はかなり多く、月末になると憂鬱になる。それに加えて、カレンダー登録の仕事が増えてしまった。
そのとき、20代グループに必死に混ざっていた30代の佐藤先輩が口を開いた。
「田中、こういう時こそ、プログラミングだろう!」
僕はハッと我に返って答えた。
「そうですよね!いつものようにExcelマクロでGoogleカレンダーに自動登録するようにすれば良いのですよね?」
そのとき、太田先輩がキリッと答えた。
「田中君、Excelは道具の一つよ。いつもExcelだけに頼らなくても良いのよ。」
僕はちょっと驚いた。入社してこの数ヶ月、プログラムと言えばExcel VBAだった。この世には、VBA以外にも経理や事務の仕事で使えるプログラミング言語があったとは・・・!
「それで、何を使ったら良いのですか?」
僕は恐る恐る尋ねた。太田先輩が答える。
「Googleカレンダーは、Googleが提供しているツールよね。だったら、Googleが提供しているプログラミング環境を使えば良いのよ。」
これに続けて佐藤先輩が偉そうに補足してくれた。
「それは『GAS(Google App Script)』と言うんだけどさ。JavaScriptを使って、GoogleスプレッドシートやGoogleカレンダーを手軽に操作できるプログラミング環境なんだ。」
やはり、世の中、知らないことばかりだ。その後、走りながら、マイクロソフトのExcelに当たる表計算ツールが、Googleスプレッドシートであることや、Googleスプレッドシートを使うと、リアルタイムで表を共同編集できることなどを教えてもらった。
そして、太田先輩が急に走る速度を落として、力説し始めたのは、Googleスプレッドシートのマクロ環境である『GAS(Google App Script)』だ。
「田中君、GASは凄いのよ。Googleの各種サービスを簡単なプログラムで自由につなぎ合わせることができるのよ。」
僕は圧倒されて「そうなんですか、明日試してみます。」と言うのが精一杯だった。そして、爽やかなランニングを終えて家に帰った後、僕はGASについていろいろ調べることになったのだった。
翌日。
出社すると、太田先輩はいつものように早めに来ていて、パンを食べながら何やらプログラムを作っていた。僕が声をかける。
「おはようございます。太田先輩、何作っているんですか?」
「あ、田中君。昨日の予定表をGoogleカレンダーに登録するプログラムだけど、楽しそうだから私、作っちゃった。これをたたき台にして、業務で使ってみて。」
さすが太田先輩だ!僕はいつものように尊敬の眼差しで彼女を眺めた。そして、初めてのGASを使ったプログラムにドキドキしていた胸をほっとなで下ろしたのだった。
実際のプログラムを見てみよう
それでは、今回、太田先輩が作ったプログラムを紹介しましょう。今回のプログラムは、Googleスプレッドシート(あるいはExcelで作った予定表)を元にして、Googleカレンダーに自動的に予定を登録するプログラムです。
【前準備】Googleアカウントの準備
GoogleスプレッドシートとそのマクロであるGAS(Google App Script)を利用するには、Googleアカウントが必要になります。アカウントがない方は、こちらを参考にして作成しましょう。
【手順1】新規スプレッドシートを作成しよう
アカウントを用意したら、最初に、Googleドライブを開きます。そして、画面左上にある「新規」のボタンをクリックし、続けて「Googleスプレッドシート」をクリックしましょう。
【手順2】表を作成しよう
続けて、予定表を準備しましょう。この表は社内の別の人がExcelで作成したものを、Googleスプレッドシートにインポートしたものとします。それで、ここでは、以下のような予定表を利用することにします。ポイントとは、B列に日付、C列に事柄が書かれており、実際の予定は4行目(セルのB4)から始まっているという点です。
なお、サンプルの予定表をこちらの六回目のサンプルからダウンロードできます。GoogleスプレッドシートにExcelファイルをインポートするには、メニューから[ファイル > インポート > アップロード]から行います。手軽に取り込むことができます。
【手順3】プログラムを作成して実行しよう
プログラムを作成するには、Googleスプレッドシートの画面のメニューから「ツール > スクリプトエディタ」を選びます。
スクリプトエディタが表示されたら、以下のプログラムを記述します。
// --- スプレッドシートの調整 ---(*1)
var DATE_COL = "B";
var TITLE_COL = "C";
var ROW_START = 4;
// 登録するカレンダーのIDを指定する場合に以下を指定
var TARGET_CAL_ID = "";
var CAL_HEADER = "社内:";
// --- 実際に登録を行うプログラム --- (*2)
function RegisterGoogleCalendar() {
// 名前から番号への変換
var getColNameToNo = function (name) {
var n = String(name).toUpperCase();
var c = "A";
return n.charCodeAt(0) - c.charCodeAt(0) + 1;
};
// シート内のデータを集める --- (*3)
const sheet = SpreadsheetApp.getActiveSheet();
const lastRow = sheet.getLastRow();
const rDate = sheet.getRange(1, getColNameToNo(DATE_COL), lastRow);
const rTitle = sheet.getRange(1, getColNameToNo(TITLE_COL), lastRow);
if (!rDate || !rTitle) {
Browser.msgBox("Config Error. Please edit Colunmn name.");
return;
}
const vDate = rDate.getValues();
const vTitle = rTitle.getValues();
const items = [];
for (var row = ROW_START - 1; row < vDate.length; row++) {
if (!vDate[row]) continue;
var d = vDate[row][0];
var t = vTitle[row][0];
if (typeof(d) === "string") continue;
items.push([d, t]);
}
Logger.log("items:::" + JSON.stringify(items));
// Googleカレンダーに登録する --- (*4)
var calendar;
if (TARGET_CAL_ID === "") {
calendar = CalendarApp.getDefaultCalendar();
} else {
calendar = CalendarApp.getCalendarById(TARGET_CAL_ID);
if (!calendar) {
Browser.msgBox("Config Error. Please edit TARGET_CAL_ID.");
return;
}
}
for (var i = 0; i < items.length; i++) {
var item = items[i];
var title = CAL_HEADER + item[1];
var date = item[0];
calendar.createAllDayEvent(title, date);
}
}
以下のようになります。メニューの「ファイル>保存」でスクリプトを保存したら、プログラムを実行してみましょう。画面上部の実行ボタンの右側にある実行関数名の選択ボックスで「RegisterGoogleCalendar」を選択したら、実行ボタンをクリックしましょう。
【手順4】スクリプトの実行を許可する
プログラムを実行すると、以下のような実行許可を求めるダイアログが表示されます。
するとアカウントの選択画面が出るので、アカウントを選びましょう。すると、以下のような警告画面が出ると思います。
そこで、画面左下にある「詳細を表示」をクリックします。すると、安全ではないページに移動という画面が出るので、画面下部にあるリンクをクリックします。すると、スクリプトの実行が許可されます。
すると、以下のような画面が出るので、「許可」のボタンをクリックしましょう。以上の手順で、プログラムを実行する許可を与えることができます。
実行してしばらく待ってから、Googleカレンダーを開いてみましょう。すると、以下のように、カレンダーに予定が登録されます。
プログラムの解説
プログラムが無事に動いたら、少しだけプログラムを確認してみましょう。今回のプログラムは、GAS(Google App Script)を利用したものです。GASでは、JavaScriptと呼ばれるプログラミング言語を利用してプログラムを作成します。JavaScriptはもともとWebブラウザを自動化するための言語でしたが、今では様々な用途で利用されています。
プログラムの(*1)の部分ですが、ここでは、Googleスプレッドシートの予定が書かれている列や行の指定を行います。読者の皆さんはきっと異なるフォーマットのスプレッドシートを利用することと思います。そこで、この部分を調整してみてください。
続く、(*2)の部分ですが、ここで実際にカレンダーに登録を行うプログラムを記述します。今回はこの関数を起点としてプログラムを実行します。(*3)の部分ではスプレッドシートの任意の列に書かれている内容を全部取得します。
そして(*4)の部分で、Googleカレンダーにスプレッドシートの予定を登録します。変数TARGET_CAL_IDにGoogleカレンダーのIDを指定していれば、そのカレンダーに対して、もし指定しなければ、そのユーザーのメインカレンダーに予定を書き込みます。
ちなみに、GASでGoogleカレンダーに予定を登録するのは簡単で、以下のように記述します。
// デフォルトカレンダーを取得する
var calendar = CalendarApp.getDefaultCalendar();
// 日付dateに、titleのカレンダーイベントを追加
calendar.createAllDayEvent(title, date);
まとめ
以上、今回はGoogleスプレッドシートの予定表を元に、カレンダーに予定を登録するプログラムを紹介しました。すでに予定表があるものの、それを元にしてカレンダーに改めて予定を登録し直しているということはないでしょうか。それが毎月繰り返し行われる作業であれば、プログラムで自動化すると便利です。ちょっとしたことですが、積み重なっていくので大いに時間を節約できます。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ、2010年 OSS貢献者章受賞。技術書も多く執筆している。