見出し画像

選択したシートを元のシート名+日付+インデックスの名前でコピーする関数

ノンプロ研でGAS勉強中です。

久しぶりに作ったちょっとしたツールの投稿です。

スプレッドシートを操作していて、テンプレートのシートをコピーして、その名前を変更(例えば日付を付加)して、さらに今日のx回目みたいなサブインデックスも足してみたいな作業が私はよくあります。

まあ、キーボードで操作してもほんの数秒でできることなのですが、時間というよりも意志力が削がれるので、これはワンボタンでできるようにしたいなと思っていました。

ちょっと前にGAS中級講座も受講していたので、ちょっとスッキリ書くことを意識して作成しました。

Dateオブジェクトを文字列に変換するためのクラス

まずは、日付の文字列型を扱うので、ストックしている日付を指定したフォーマットの文字列型に簡単に変換できるクラスを用意

/**
* 様々なデータ型の日付を文字列型やDateオブジェクトに変換するクラス
*/

class DateFromat {
 /**
 * 日付を指定フォーマットの文字列型に変換したオブジェクトを生成するコンストラクタ
 * @constructor
 * @param {date}    date      Date オブジェクト 文字列型も可
 * @param {string}  format    文字列に変換するフォーマット  
 */
 constructor(date = new Date(), format = 'yyyy-MM-dd') {
   this.date = new Date(date);
   this.string = Utilities.formatDate(this.date, 'JST', format);
 }
}

Utilities.formatDate()というのがいつも長くて書くのが大変なので、このクラスは重宝しています。

メインの実行関数は10行くらい

ということで、作ったスクリプトがこちら。

/**
* 選択したシートを元のシート名+日付+インデックスの名前でコピーする関数
*/

function copyActiveSheet() {
 // アクティブなシートとそのシート名を取得
 const ss = SpreadsheetApp.getActiveSpreadsheet();
 const sheetActive = ss.getActiveSheet();
 const sheetName = sheetActive.getName();

 // 今日の日付をyyyy-MM-dd形式の文字列で取得
 const strToday = new DateFromat().string;

 // すべてのシートを取得しその名前を配列に格納
 const sheets = ss.getSheets();
 const names = sheets.map(sheet => sheet.getName());

 // すべてのシートの名前に今日の日付の文字列が含まれる配列のみを抽出しその要素数+1(本日x回目のコピーか)を取得
 const aryToday = names.filter(name => name.includes(strToday));
 const subNum = aryToday.length + 1;
 
 // 元のシート名+日付+インデックスの名前でコピー
 const newName = sheetName + strToday + '_' + subNum
 ss.insertSheet(newName, sheetActive.getIndex(), { template: sheetActive });
}

1. map()メソッドつかって、すべてのシート名の配列を作って
2. filter()メソッドつかって、今日の日付の文字列が含まれるシート名の配列だけに絞り込んで
3. ↑の要素数=今日x回コピーしたかをlengthプロパティで取得して+1
4. insertSheet()メソッドで選択したシートの右隣に「元のシート名+日付+インデックスの名前」でコピー

という流れになっています。

シートをコピーするだけならSheetオブジェクトのcopyTo()メソッドが使えるのですが、名前とシートの挿入場所を一発で決めるには、SpreadSheetオブジェクトのinsertSheet()のほうが、細かくパラメーターを指定できます。

こんなメソッド知らないよ…ってのは普通だと思うので、リファレンス見るの大事ですね。

GASはノンプロ研で勉強しています。


いいなと思ったら応援しよう!