見出し画像

GAS 任意の名前でスプレッドシートの複製コピーを作成する


参考にしたURL

https://www.indetail.co.jp/blog/171223/

これを試してみて、これができるなら、条件を付け加えれば、ファイル名にしたいリストの分のコピーができるはず、と思って試してみた。

今回やりたいこと

画像1

コピー元となるスプレッドシートファイルがある。

それとは別のスプレッドシートファイルに、ファイル名として書き出したいリストを用意した。

スクリプトはスタンドアロンとした。

フォルダ、ファイル構成

画像3

スクリプトについては、次の項目、コードに記す。

コピー元のスプシはなんでもいい。月次報告のテンプレだとか、お名前差し込んで配らなくてはいけないものとか。

各ファイル名リスト表はこんな感じになっている。
この名前をコピーしたときにそれぞれのファイルに付くようにしたい。

画像4

コード

// シートの自動作成スクリプト
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をキチンと設定しておけば、スクリプトエディタでこれを実行すると、下図のようにちゃんと複製できている。名前もちゃんとついてる。やったー!(初回は権限認証を訊かれる)

画像5

最初、let fileName = sheet.getRange(i, 1).getValue() の .getValue() が抜けていて、名前が意図したとおりにつかない~なんでだ~となっていた。

この点、またしてもノンプロ研でご指摘いただいた。ありがとうございます!

取得する値がないのだから、コピーしても出てこないわけだ。

ちなみに、.getValue() が無いままスクリプトを実行すると、このようなファイルができる。本来はファイル名が入って欲しいところがRangeになる。

画像1

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ゲッター機能を付けつつ)ポチっとやったら複製できる、とかすると、いいかもしれない。

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

good-sun(a03)
いただいたサポートで、書籍代や勉強費用にしたり、美味しいもの食べたりします!