【GAS】google apps script で期日管理をやってみよう!


google apps script (GAS) で期日管理をしよう!と思い立ったいきさつは,こちらに書いているとおりです。

巷には法律事務所用の業務管理アプリケーションがいろいろあります。
でも,今のところ弊所では,あれもこれもできるような大げさなものを導入する必要性に駆られているわけではありません。
こんなのができたらいいな,くらいのことです。

方法はいろいろあるのでしょうが,弊所では google workplace を以前から利用していますので,それなら google apps script で,ということになりました。



あぶないところでした・・・スケジュールを入れ忘れてました。

期日の一覧表からgoogleカレンダーの予定を直接書き込めたら,記入漏れがなくなっていいなって思うんですけど・・・。

なるほど。それはいいかもね。
googleスプレッドシートとgoogleカレンダーでできるから,さっそくやってみましょう。

スプレッドシートで期日一覧表を作るんですね?
カレンダーの予定では「タイトル」「開始日時」「終了日時」「場所」「説明」を使っています。

じゃあそれを列に配置して,1行ずつ期日を書いていけばいいね。
まず,1行目に,列の左から「件名」「日付」「開始時間」「終了時間」「場所」「説明」を順番に指定してください。
2行目からデータを入れてね。

「日付」は,日付の列を選択して,データ>データの入力規則>条件:日付:有効な日付,「保存」ってすれば,セルのダブルクリックでカレンダーが出てきます。
出てきたカレンダーをクリックして「有効な日付」が入力できるから,そうしてね。

「開始時間」「終了時間」は,「15:00」みたいな形式で書くといいよ。
変なデータを入力してエラーにならないように,さっきのデータの入力規則で「条件:リストを直接指定」にして,あらかじめ時間のリストを書いておくと,ドロップダウンリストから選択できるようになるから間違いがなくなるかもよ。
粗忽者にはもってこいだねー。

ふ~,粗忽者にもできましたよ。
「期日管理」っていうファイルの「テスト」っていうシートにしました。

ABCDEF
1件名 日付 開始時間 終了時間 場所 説明
2あの件 20-12-07 10:00 11:00 京都地裁 楽勝
3この件 20-12-16 15:00 17:00 京都家裁 本人同伴
4 その件 20-12-25 13:00 14:00 大阪高裁 行きたくない


最初は試すだけだからたくさん入力しなくっていいよ(笑)
じゃあ,今作った一覧表からデータを読み取りましょう。
spread sheetのセルからのデータの取得は,基本的に,[アクティブなシート].[データを取得するセルの範囲].[セルの値の取得]でできます。
だから,まずアクティブなシートを取得する必要があるね。

const sheet =  SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

なんのことだか・・・。

「.」は,「~の」みたいに考えておいたら大丈夫。
「スプレッドシート」アプリケーションの,現在アクティブな「期日管理」ファイルの「テスト」シートを取得して,それを定数sheetに格納する,つまり,sheet が今開いているアクティブなシートを意味している,くらいの理解でいいと思うよ。
次に,「テスト」シートのセルの範囲を指定して,その範囲のデータを取得します。
セルの範囲の指定は,(最初の行,最初の列,行数,列数)で指定できるから,

const topRow = ‘データを書き込んだ範囲の最初の行番号’
const topCol = ‘データを書き込んだ範囲の最初の列番号’
const rowNum = ‘データを書き込んだ範囲の行数’
const colNum = ‘データを書き込んだ範囲の列数’

と定義して,

const contents = sheet.getRange(topRow, topCol, rowNum, colNum).getValues();

で,アクティブなシートの指定範囲から取得したデータを定数contentsに格納できます。

一番上の行に表題を書いて,上の6つの内容を含んだ事件を3つ入力したから,書き込んだデータは2行目のA列から,4行目のF列までですね。だから,

const topRow = 2;
const topCol = 1;
const rowNum = 3;
const colNum = 6;

とすればいいんですね。
そして,「テスト」シートの,この範囲の,値を取得して,contentsに格納する,ですね。

そうですね。
この場合だと,contents[0][0]からcontents[2][5]までに,セルの内容が格納されることになるね。

constって定数の宣言をしただけだけど,contentsは2次元の配列になるんですね。
で,その配列は[0][0]から始まると。

次に,contentsからデータを取り出して予定を作成します。
まず,日付情報を扱うときには形式のルールを決めておく必要があるよね。

でないと,どの数字が分なのか時なのか日なのか,分からないですからね。

GASで日付情報は,Dateクラスを使って生成したオブジェクトとして扱います。

・・・。

Dateクラスで決められたルールに従う,くらいでいいと思うよ。
実際に日付を変数dayとして扱うときは,次のようにします。

let day = new Date(’値’);

ということは,

let startDate = new Date(contents[1][1]);

とすれば,セルB2から読み込んだ値(「日付」)を,GASの日付情報として変数startDateに格納できるんですね。
でも予定は「開始日時」「終了日時」だから,「日」だけでなくて「開始時間」と「終了時間」も必要です。

ですね。
contents[1][2]から「開始時間」,たとえば「10:00」を取得してstartTimeに格納されているとすると,ここから「時」と「分」とを取り出して,stratDateにセットします。

let startTime = contents[1][2];
startDate.setHours(startTime.getHours());
startDate.setMinutes(startTime.getMinutes());

終了日時は「日付」と「終了時間」とで,同じようにすればいいわけですね。

let endDate = new Date(contents[1][1]);
let endTime = contents[1][3];
endDate.setHours(endTime.getHours());
endDate.setMinutes(endTime.getMinutes());

そのとおり。
「タイトル」はcontentsから取り出したままでいいから,これで予定にセットする「タイトル」「開始時間」「終了時間」が準備できたということになるね。

let title = contents[1][0];

あれ?「場所」と「説明」は?

あせらないことが大切。
カレンダーに書き込む関数は,createEvent();です。
「タイトル」「開始時間」「終了時間」「場所と説明」を引数にします。
そして「場所と説明」は,{location:  ‘場所’, discription: ’説明’} のような1次元配列で指定します。
だから,ここの’場所’と’説明’とに,contentsの内容を入れておきます。

let options = {location: contents[1][4], description: contents[1][5]};

なるほど。
書き込むカレンダーの指定はどうするんですか。

書き込みたいカレンダーのIDを取得します。
googleカレンダーの画面左端に,表示するカレンダーをチェックするリストがあるよね?
その右端に現れる縦3点をクリックして,さらに「設定と共有」をクリックします。
そして「カレンダーの統合」っていうところへ行くと,一番上に「カレンダーID」っていうのがあるから,これをコピーします。

じゃあ追加したカレンダーでもできるんですね。

そのとおり。
このIDを,

CalendarApp.getCalendarById(‘ID’);

の’ID’のところにいれると,書き込むカレンダーにアクセスします。
たとえば,このIDを変数gAccountに格納したとすると,

let gAccount = xxxxxxx@xxxxxxx.xxxx
let calender = CalendarApp.getCalendarById(gAccount);
calender.createEvent(title,startDate,endDate,options);

で,ねらったカレンダーに予定が作成できます。

これを骨組みにしてやってみます!

contentsからのデータの読み出しは,forループで回すといいよ。
スクリプトエディタの開き方は大丈夫?

さっきの「期日管理」スプレッドシートの「ツール」>「スクリプトエディタ」ですね。

正解。じゃあ,がんばって!
ひととおりできたら,いろいろ工夫したくなるだろうから,そのときはまた聞いてね。

コメント