fこんにちは。ITライターのもり(@moripro3)です!GoogleAppsScriptの記事をお届けしています!
連載シリーズ「GASとスプレッドシートで作る勤怠管理ツール」では、勤怠管理ツールを題材としたGASの活用事例を紹介しています。
前回の記事では、月が変わる場合に必要な「日付処理」を紹介しました。
シリーズ第4回目のこの記事では、「翌月シートの一括作成」の一部である「シートのコピー処理」に焦点をあてて紹介していきます。
スプレッドシートを使っているみなさん、GASを使った自動化でわずらわしい手作業から解放されましょう!
勤怠管理ツール・翌月シートの一括作成
このシリーズで紹介する「勤怠管理ツール」は2種類のスプレッドシートで構成されています。
- タイムシート集計(管理者用)
- 勤怠表(社員用)
①と②のスプレッドシートは関数でリンクしています。※連載シリーズの最後で実物のファイルを公開しますので、関数の仕組みはそちらをご覧ください
①②それぞれのスプレッドシートについて、月が変わるたびに新しいシートを作成します。2019年9月から2019年10月になる場合、「201909」シートをコピーして「201910」シートを作成します。
「翌月シートを作る」処理を分解すると、こうなります。
- ①「当月のシート名(201909)」から「翌月のシート名(201910)」の文字列を作成する
- ②「当月シート」をコピーして「翌月シート」を作成する(シート名は①の文字列)
- ③「翌月シート」の、前月分の入力値をクリアする
前回の記事では①の「当月のシート名(201909)」から「翌月のシート名(201910)」を作成する関数を作りました。
今回の記事は、以下の処理(②)を作っていきます。
- ②「当月シート」をコピーして「翌月シート」を作成する(シート名は①の文字列)
シートコピーの仕組み
この項では、「翌月シートを作成する」の処理を確認します。下記図のイメージです。
この作業をプログラムで実行すると、どうなるでしょうか。
「プログラム」は、原則、人間の手作業をそのまま再現するので、まずは人間の手作業を細かく分解してみます。このような1~3の工程に分けられます。
- 【処理1】シートのコピーを作成(※GASで実行すると末尾に配置される)
- 【処理2】シート名を設定
- 【処理3】シートを左から1番目に移動
処理1~3を実行する関数を作ります。
シートをコピーして1番左に移動する関数
まずは関数の全体像を把握します。こんな処理をしてくれる関数を作りたいわけですね。
[①シート]を[②スプレッドシート]にコピーしてね。コピーしてできた新しいシートのシート名は[③文字列]にしてね。最後に[④新しいシート]を返してね。
関数の仮引数(①~③)・戻り値(④)はそれぞれこのようにします。
- 仮引数(3つ)
- コピー先のスプレッドシート[①オブジェクト]
- コピー元のシート[②オブジェクト]
- 新規シート名[③文字列]
- 戻り値(1つ)
- コピーした新規シート[④オブジェクト]
[①~④]と「関数」の関係を図にしたイメージです。3つ受け取って、1つ返します。
それでは処理をGASで書いていきましょう!
【処理1】シートのコピーを作成する
まずは、シートのコピーを作成する処理です。2019年9月から2019年10月になる場合、「201909」シートをコピーします。
SheetクラスのcopyToメソッドでシートコピーができます。このcopyToメソッドは、「どのスプレッドシートにコピーするか?」という「コピー先のスプレッドシート」を指定します。
※同じスプレッドシート内にコピーする場合でも、指定が必要です。
Sheetオブジェクト.copyTo(コピー先のSpreadsheetオブジェクト)
シートを特定のスプレッドシートにコピーします。
コピーされたシートの名前は「[元の名前]のコピー」になります。[201909]シートをコピーしたら[201909のコピー]というシートが作成されます。
コードがこちらです。仮引数の変数名は下記のように定義します。
- コピー元シート = oldSheet
- コピー先スプレッドシート = targetSS
var newSheet = oldSheet.copyTo(targetSS);
この処理で新しく作成されたシートを、変数newSheetに格納します。
【処理2】新規シート名を設定
コピーしたシートの「シート名」を設定します。仮引数の文字列をセットします。(この場合 ‘201910’)
SheetクラスのsetNameメソッドでシート名を設定できます。
Sheetオブジェクト.setName(文字列)
シート名を設定します。
コードがこちらです。仮引数の変数名はnewSheetNameと定義します。
newSheet.setName(newSheetName);
【処理3】新規シートを左から1番目に移動する
この時点で、新規シートはスプレッドシート全体の最後にあります。このシートを、スプレッドシート内の先頭、つまり、左から1番目に移動します。
さて、このシートの移動処理はひと工夫します。
GASでは、「”この”シートをここに移動してね」というメソッドが存在しないのです。
「”アクティブ”なシートをここに移動してね」のメソッドは存在するので、このメソッドを使って下記の2ステップで処理します。
- ①移動対象のシートをアクティブにする(setActiveSheetメソッド)
- ②アクティブなシートを1番目に移動する(moveActiveSheetメソッド)
①移動対象のシートをアクティブにする
まずは、移動したいシートをアクティブにします。SpreadsheetクラスのsetActiveSheetメソッドを使用します。
Spreadsheetオブジェクト.setActiveSheet(sheetオブジェクト)
引数に指定したシートをアクティブにします。※引数は「シート名」ではなく「Sheetオブジェクト」を指定します。
※操作対象のオブジェクトはSpreadsheetオブジェクトです。
「Spreadsheetクラス」と「Sheetクラス」は異なります。
- Spreadsheetクラス→「スプレッドシート」にアクセスするためのクラス
- Sheetクラス→「シート」にアクセスするためのクラス
Spreadsheetクラスの公式リファレンスはこちら
コードがこちらです。
targetSS.setActiveSheet(newSheet);
②アクティブなシートを1番目に移動する
アクティブなシートを移動します。SpreadsheetクラスのmoveActiveSheetメソッドを使用します。
Spreadsheetオブジェクト.moveActiveSheet(位置)
アクティブなシートを、スプレッドシート内の指定位置に移動します。
引数にインデックス(位置)を指定します。シートのインデックスは、左から1,2,3・・・となっています。
コードがこちらです。1番目に移動したいので、引数に「1」を指定します。
targetSS.moveActiveSheet(1);
これで、目的どおりシートのコピーができました!
作成したシートを呼び出し元に返す
最後に、新しく作成したシート(変数newSheet)を呼び出し元に返します。
この関数は「勤怠管理ツール」全体の中の一部分の処理なので、この「新規シート」に対して、先月の入力値をクリアしたり、セルの年月を設定したり・・・といった後続の処理もあるわけですね。
そこで、呼び出し元の関数がこのシートを操作できるよう「これが新しいシートですよ」と返してあげます。
return文でオブジェクトを返します。戻り値(返り値)という表現だと「値」しか返せないのかな?と思いますが、return文では「オブジェクト」を返すことも可能です。
return newSheet;
スクリプトまとめ
今回の記事で作成したスクリプトのまとめです。
/* * [指定シート]を[指定スプレッドシート]にコピーして[シート名] を設定し、1番目に移動する * * @param {Object} コピー元シート * @param {Object} コピー先スプレッドシート * @param {String} 新規シート名 * @return {Object} 新規シート */ function CopySheet(oldSheet,targetSS,newSheetName) { /*** 【処理1】「コピー元シート」を「コピー先スプレッドシート」にコピーする ***/ var newSheet = oldSheet.copyTo(targetSS); /*** 【処理2】新規シートにシート名を設定 ***/ newSheet.setName(newSheetName); /*** 【処理3】新規シートをスプレッドシートの1番目に移動 ***/ targetSS.setActiveSheet(newSheet); targetSS.moveActiveSheet(1); return newSheet; }
まとめ:GASとスプレッドシートで作る勤怠管理ツール
GASで「シートをコピーして新しいシートを作成し、スプレッドシートの一番左に移動する」処理を紹介しました。
スプレッドシート・シートの処理をするときは、操作対象のオブジェクトが「Spreadsheetオブジェクト」なのか「Sheetオブジェクト」であるのかを注意する必要がありますね。
ここまでで、必要な関数が揃いました。次回は、これらの関数を使ってツールを完成させます。メイン処理である「管理者用・社員用のスプレッドシートの数、翌月シートを作成する」処理を作ります。
【連載目次:GASとスプレッドシートで作る勤怠管理ツール】