概要
対象者を記載することで、スプレッドシートのテンプレシートを対象者の名前でその数分コピーするスクリプトを作りました。
同じシートを複数、名前を変えて作ることができます。
イベントや各種表を人数分作りたい時に便利です。
例
対象者の名前分、交通費のテンプレートのコピーを作成します。
アプローチ
以下の方針でアプローチしました。
- 対象者を取得する。
- 対象者分、繰り返す。
-1.対象者の名前で既にシートがあればスキップする。
-2.テンプレシートをコピーする。
-3.コピーされたシートを対象者の名前でリネームする。 - 作成したシート数を表示する
エッセンス
1. 対象者を取得する。
以下のように実装しています。
memberSheet は対象者一覧のシートでSheetオブジェクトです。
var members = memberSheet.getDataRange().getValues();
Sheetオブジェクト.getDataRange() では Rangeオブジェクトが返ってきます。
Rangeオブジェクトに対して、getValues()することで値が入っている範囲を行・列の二次元配列として取得できます。
https://developers.google.com/apps-script/reference/spreadsheet/sheet#getdatarange
https://developers.google.com/apps-script/reference/spreadsheet/range#getvalues
2. 対象者分、繰り返す。
2-2 対象者の名前で既にシートがあればスキップする。
スプレッドシートでは同じ名前のシートは作れません。
対象の名前で既に存在する場合は、作成をスキップする必要があります。
THIS_SHEETはこのGASがあるスプレッドシートで、SpredSheetオブジェクトです。
memberNameは 1. で取得した対象者の個々の名前です。
// 対象者の名前のシートを探す
var memberNamedSheet = THIS_SHEET.getSheetByName(memberName);
// 作成されていない場合のみ作成する
if(memberNamedSheet == null){
// 作成処理
}
getSheetByName(name)で、その名前のシートを取得できます。
ない場合はNULLが返ります。
https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getsheetbynamename
2-3 コピーされたシートを対象者の名前でリネームする。
templateSheet はテンプレートのシートでSheetオブジェクトです。
// 「テンプレート のコピー」 を作成し、名前を変更する。
templateSheet.copyTo(THIS_SHEET).setName(memberName);
copyTo(sSheet)でスプレッドシートをコピー先を指定してコピーできます。
名前が「[元の名前]のコピー」となるので、setNameで名前を変更しています。
https://developers.google.com/apps-script/reference/spreadsheet/sheet#copytospreadsheet
https://developers.google.com/apps-script/reference/spreadsheet/sheet#setnamename
その他UI的なところ
実行するためのボタンをツールバーに追加
以下でスプレッドシートを開いた時にボタンを追加します。
addItemの第二引数は関数の名前を指定してあげればOKです。
function onOpen() {
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu("シート作成");
menu.addItem("シート作成実行","makeSheets");
menu.addToUi();
}