GAS 任意の名前でスプレッドシートの複製コピーを作成する
参考にしたURL
https://www.indetail.co.jp/blog/171223/
これを試してみて、これができるなら、条件を付け加えれば、ファイル名にしたいリストの分のコピーができるはず、と思って試してみた。
今回やりたいこと
コピー元となるスプレッドシートファイルがある。
それとは別のスプレッドシートファイルに、ファイル名として書き出したいリストを用意した。
スクリプトはスタンドアロンとした。
フォルダ、ファイル構成
スクリプトについては、次の項目、コードに記す。
コピー元のスプシはなんでもいい。月次報告のテンプレだとか、お名前差し込んで配らなくてはいけないものとか。
各ファイル名リスト表はこんな感じになっている。
この名前をコピーしたときにそれぞれのファイルに付くようにしたい。
コード
// シートの自動作成スクリプト
function createCopySpreadSheet() {
// コピー元テンプレートファイルのID
const templateFile = DriveApp.getFileById('your ID');//★入力してください。
// コピー出力するフォルダのID
const OutputFolder = DriveApp.getFolderById('your ID');//★入力してください。
// コピー出力するファイル名の取得-ファイル名情報があるスプシのID
const ss = SpreadsheetApp.openById('your ID');//★入力してください。
//コピーファイルのファイル名情報があるスプシのシートとその最終行を定義
const sheet = ss.getSheetByName('your sheet name');//★入力してください。
const lastRow = sheet.getLastRow();
//コピー出力するファイル名があるセルを取得する
for (let i = 2; i <= lastRow; i++) {//2行目以降から最終行までを下に走査していく。
if (sheet.getRange(i, 1).getValue() !== '') {//ファイル名が空白でなければその間繰り返す。
let fileName = sheet.getRange(i, 1).getValue();//i行目の1列目をファイル名として取得する。
// 出力ファイル名
const OutputFileName = templateFile.getName().replace('_template', '') + '_' + fileName;
// +'_'+Utilities.formatDate(new Date(), 'JST', 'yyyyMM') 日付が必要な場合はこれを使う。
// コピー作成
templateFile.makeCopy(OutputFileName, OutputFolder);
}
}
}
IDをキチンと設定しておけば、スクリプトエディタでこれを実行すると、下図のようにちゃんと複製できている。名前もちゃんとついてる。やったー!(初回は権限認証を訊かれる)
最初、let fileName = sheet.getRange(i, 1).getValue() の .getValue() が抜けていて、名前が意図したとおりにつかない~なんでだ~となっていた。
この点、またしてもノンプロ研でご指摘いただいた。ありがとうございます!
取得する値がないのだから、コピーしても出てこないわけだ。
ちなみに、.getValue() が無いままスクリプトを実行すると、このようなファイルができる。本来はファイル名が入って欲しいところがRangeになる。
getName
getName().replace('_template', '') ここがよくわからなかった。
リファレンスを見る。
getNameでシートの名前を返すことはわかった。そのあと、replaceで置き換えているのだと想像する。replaceの引数がなんなんだ?
replace
replace(検索する文字列,置換する文字列)
なのか?
では、このコードの場合を考えると
const OutputFileName = templateFile.getName().replace('_template', '') + '_' + fileName;
これは、templateFile(DriveApp.getFileById('****');)から、getName() でそのまま元ファイルの名前をゲットし、replace('_template', '') で、特に元の名前を置き換えずにそのままにしつつ、+ '_' + fileName でアンダーバーとfileNameを足している、ということか。たぶん。
検索する文字列が'_template'ってなんなの。
'_template' がどこから出てきたのかよく分からない。templateFile のこと?
今後の展開
2~3件で頻繁にないものなら、手作業コピペでも構わないのだが、参考にしたURLにもあるとおり、定期的あるものや複数あるものの場合には、トリガーと組み合わせて有効活用できそう。
スクリプトのままだと、ノンプロユーザには使いづらいかもしれない。
複製用のスプレッドシートシートを用意して、IDはうまいこと入力してもらって(入力支援用のIDゲッター機能を付けつつ)ポチっとやったら複製できる、とかすると、いいかもしれない。