【GASで勤怠管理ツール④】シートをコピーしてスプレッドシート内の一番左に移動する

こんにちは。ITライターのもり(@moripro3)です!GoogleAppsScriptの記事をお届けしています!

連載シリーズ「GASとスプレッドシートで作る勤怠管理ツール」では、勤怠管理ツールを題材としたGASの活用事例を紹介しています。

前回の記事では、月が変わる場合に必要な「日付処理」を紹介しました。

【GASで勤怠管理ツール③】今月日付から翌月日付(YYYYMM形式)を作る

2019.10.09

シリーズ第4回目のこの記事では、「翌月シートの一括作成」の一部である「シートのコピー処理」に焦点をあてて紹介していきます。

スプレッドシートを使っているみなさん、GASを使った自動化でわずらわしい手作業から解放されましょう!

勤怠管理ツール・翌月シートの一括作成

このシリーズで紹介する「勤怠管理ツール」は2種類のスプレッドシートで構成されています。

  1. タイムシート集計(管理者用)
  2. 勤怠表(社員用)

①と②のスプレッドシートは関数でリンクしています。※連載シリーズの最後で実物のファイルを公開しますので、関数の仕組みはそちらをご覧ください

①②それぞれのスプレッドシートについて、月が変わるたびに新しいシートを作成します。2019年9月から2019年10月になる場合、「201909」シートをコピーして「201910」シートを作成します。

GASで翌月用にシートをコピーする

 

「翌月シートを作る」処理を分解すると、こうなります。

  • ①「当月のシート名(201909)」から「翌月のシート名(201910)」の文字列を作成する
  • ②「当月シート」をコピーして「翌月シート」を作成する(シート名は①の文字列)
  • ③「翌月シート」の、前月分の入力値をクリアする

前回の記事では①の「当月のシート名(201909)」から「翌月のシート名(201910)」を作成する関数を作りました。

今回の記事は、以下の処理(②)を作っていきます。

  • ②「当月シート」をコピーして「翌月シート」を作成する(シート名は①の文字列)

シートコピーの仕組み

この項では、「翌月シートを作成する」の処理を確認します。下記図のイメージです。

GASでシートをコピーする

この作業をプログラムで実行すると、どうなるでしょうか。

「プログラム」は、原則、人間の手作業をそのまま再現するので、まずは人間の手作業を細かく分解してみます。このような1~3の工程に分けられます。

  • 【処理1】シートのコピーを作成(※GASで実行すると末尾に配置される)
  • 【処理2】シート名を設定
  • 【処理3】シートを左から1番目に移動
GASでシートをコピーする3ステップ

処理1~3を実行する関数を作ります。

シートをコピーして1番左に移動する関数

まずは関数の全体像を把握します。こんな処理をしてくれる関数を作りたいわけですね。

[①シート]を[②スプレッドシート]にコピーしてね。コピーしてできた新しいシートのシート名は[③文字列]にしてね。最後に[④新しいシート]を返してね。

関数の仮引数(①~③)・戻り値(④)はそれぞれこのようにします。

  • 仮引数(3つ)
    • コピー先のスプレッドシート[①オブジェクト]
    • コピー元のシート[②オブジェクト]
    • 新規シート名[③文字列]
  • 戻り値(1つ)
    • コピーした新規シート[④オブジェクト]

[①~④]と「関数」の関係を図にしたイメージです。3つ受け取って、1つ返します。

GASでシートコピーの引数と戻り値

それでは処理をGASで書いていきましょう!

【処理1】シートのコピーを作成する

まずは、シートのコピーを作成する処理です。2019年9月から2019年10月になる場合、「201909」シートをコピーします。

シートのコピーを作成

SheetクラスのcopyToメソッドでシートコピーができます。このcopyToメソッドは、「どのスプレッドシートにコピーするか?」という「コピー先のスプレッドシート」を指定します。

※同じスプレッドシート内にコピーする場合でも、指定が必要です。

copyToメソッド

Sheetオブジェクト.copyTo(コピー先のSpreadsheetオブジェクト)

シートを特定のスプレッドシートにコピーします。

コピーされたシートの名前は「[元の名前]のコピー」になります。[201909]シートをコピーしたら[201909のコピー]というシートが作成されます。

コードがこちらです。仮引数の変数名は下記のように定義します。

  • コピー元シート = oldSheet
  • コピー先スプレッドシート = targetSS
 

この処理で新しく作成されたシートを、変数newSheetに格納します。

 

【処理2】新規シート名を設定

コピーしたシートの「シート名」を設定します。仮引数の文字列をセットします。(この場合 ‘201910’)

シート名を設定

SheetクラスのsetNameメソッドでシート名を設定できます。

setNameメソッド

Sheetオブジェクト.setName(文字列)

シート名を設定します。

コードがこちらです。仮引数の変数名はnewSheetNameと定義します。

 

【処理3】新規シートを左から1番目に移動する

この時点で、新規シートはスプレッドシート全体の最後にあります。このシートを、スプレッドシート内の先頭、つまり、左から1番目に移動します。

シートを左から1番目に移動

さて、このシートの移動処理はひと工夫します。

GASでは、「”この”シートをここに移動してね」というメソッドが存在しないのです。

「”アクティブ”なシートをここに移動してね」のメソッドは存在するので、このメソッドを使って下記の2ステップで処理します。

  • ①移動対象のシートをアクティブにする(setActiveSheetメソッド)
  • ②アクティブなシートを1番目に移動する(moveActiveSheetメソッド)

 

①移動対象のシートをアクティブにする

まずは、移動したいシートをアクティブにします。SpreadsheetクラスのsetActiveSheetメソッドを使用します。

setActiveSheetメソッド

Spreadsheetオブジェクト.setActiveSheet(sheetオブジェクト)

引数に指定したシートをアクティブにします。※引数は「シート名」ではなく「Sheetオブジェクト」を指定します。

※操作対象のオブジェクトはSpreadsheetオブジェクトです。

ポイント

「Spreadsheetクラス」と「Sheetクラス」は異なります。

  • Spreadsheetクラス→「スプレッドシート」にアクセスするためのクラス
  • Sheetクラス→「シート」にアクセスするためのクラス

Spreadsheetクラスの公式リファレンスはこちら

コードがこちらです。

 

②アクティブなシートを1番目に移動する

アクティブなシートを移動します。SpreadsheetクラスのmoveActiveSheetメソッドを使用します。

moveActiveSheetメソッド

Spreadsheetオブジェクト.moveActiveSheet(位置)

アクティブなシートを、スプレッドシート内の指定位置に移動します。

引数にインデックス(位置)を指定します。シートのインデックスは、左から1,2,3・・・となっています。

コードがこちらです。1番目に移動したいので、引数に「1」を指定します。

 

これで、目的どおりシートのコピーができました!

シートコピーの結果

 

作成したシートを呼び出し元に返す

最後に、新しく作成したシート(変数newSheet)を呼び出し元に返します。

この関数は「勤怠管理ツール」全体の中の一部分の処理なので、この「新規シート」に対して、先月の入力値をクリアしたり、セルの年月を設定したり・・・といった後続の処理もあるわけですね。

そこで、呼び出し元の関数がこのシートを操作できるよう「これが新しいシートですよ」と返してあげます。

return文でオブジェクトを返します。戻り値(返り値)という表現だと「値」しか返せないのかな?と思いますが、return文では「オブジェクト」を返すことも可能です。

 

スクリプトまとめ

今回の記事で作成したスクリプトのまとめです。

 

まとめ:GASとスプレッドシートで作る勤怠管理ツール

GASで「シートをコピーして新しいシートを作成し、スプレッドシートの一番左に移動する」処理を紹介しました。

スプレッドシート・シートの処理をするときは、操作対象のオブジェクトが「Spreadsheetオブジェクト」なのか「Sheetオブジェクト」であるのかを注意する必要がありますね。

ここまでで、必要な関数が揃いました。次回は、これらの関数を使ってツールを完成させます。メイン処理である「管理者用・社員用のスプレッドシートの数、翌月シートを作成する」処理を作ります。

【GASで勤怠管理ツール⑤】複数のスプレッドシートに対して同じ処理を繰り返す

2019.10.17

 


sweeep|請求書AI-OCR

請求書の会計処理を自動化します
請求書AI-OCR「sweeep」

面倒な請求書の会計処理をAIで自動化。100枚をたった3分で処理できます。月末に貯まった請求書を一掃しましょう。