GASでスプレッドシートをコピー、シート内の一番左に表示する方法

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

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

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

シリーズ第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メソッドは、「どのスプレッドシートにコピーするか?」という「コピー先のスプレッドシート」を指定します。

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

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番目に移動します。

シートを左から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とスプレッドシートで作る勤怠管理ツール】

  1. GASでスプレッドシートのシフト表を自動化するには?
  2. スプレッドシートのユーザー編集権限を変更する方法
  3. GASでスプレッドシート活用術。今月日付から翌月日付を作る
  4. GASでスプレッドシートをコピー、シート内の一番左に表示する方法
  5. GASで複数のスプレッドシートに対して同じ処理を繰り返す(※サンプルファイル公開あり)
請求書の受け取りはsweeepで自動化

【AI請求書処理】従来の請求書OCRでは対応できない非定型帳票や

自動会計仕訳も、sweeepなら対応可能!最短で即日導入、

面倒な設定不要。手軽に導入して請求業務を効率化。