こんにちわ。たろ(@tarohibi)です。
今日は、「GASでスプレッドシートを任意の枚数複製する方法」をご紹介します。
実装自体は簡単なので、手作業でやっている方は是非お試し下さい。
では、いってみます。
やりたいこと
どんなスプレッドシートでもいいんですが、複製するのって手間じゃないですか?何十枚・何百枚単位で複製かけるとなったら、手動ではうんざりモードに入ります。
こういった場合、GAS(Google Apps Script)を使用すれば、一瞬で作成できます。
ということで、コードをご紹介していきます。
完成形
GAS(Google Apps Script)の導入方法に関しては、他サイトでも載っていますので割愛します。
やり方は簡単なんで、是非1度試してみて下さい。
以下の完成形コードを入れます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
/** * 現在選択されているシートを指定された枚数だけ複製します。 * @param {number} numberOfCopies - 複製するシートの枚数 */ function duplicateActiveSheet(numberOfCopies) { const ss = SpreadsheetApp.getActiveSpreadsheet(); const activeSheet = ss.getActiveSheet(); const sheetName = activeSheet.getName(); // 複製するシートの名前を配列にまとめる const newSheetNames = Array.from({length: numberOfCopies}, (_, i) => `${sheetName} - Copy ${i + 1}`); // 複製数だけシートを一度に複製 newSheetNames.forEach(name => { const newSheet = activeSheet.copyTo(ss); newSheet.setName(name); }); } /** * メッセージボックスで複製するシートの枚数を入力して、入力された枚数を返します。 * @returns {number} 複製するシートの枚数。キャンセルが選択された場合は -1。 */ function promptForNumberOfCopies() { // メッセージボックスで複製するシートの枚数を入力 const numberOfCopies = Browser.inputBox('シートを複製する枚数を入力してください', '数字を入力してください', Browser.Buttons.OK_CANCEL); // キャンセルボタンが押された場合、-1を返す if (numberOfCopies === 'cancel') { return -1; } // 入力された数字を整数に変換 const numberOfCopiesInt = parseInt(numberOfCopies); // 入力が正しい整数であることを確認 if (isNaN(numberOfCopiesInt) || numberOfCopiesInt < 1) { Browser.msgBox('無効な入力です。1以上の整数を入力してください。'); return -1; } return numberOfCopiesInt; } function executeDuplicationProcess() { // メッセージボックスで複製するシートの枚数を入力 const numberOfCopies = promptForNumberOfCopies(); // 入力が正しい場合、シートを複製 if (numberOfCopies !== -1) { duplicateActiveSheet(numberOfCopies); } } function onOpen() { const ss = SpreadsheetApp.getActiveSpreadsheet(); ss.addMenu('各種メニュー', [ { name: 'シート複製', functionName: 'executeDuplicationProcess' }, ]); } |
上記をコード入力して、一度ファイルを閉じます。
再度オープンすると、メニュー欄に各種メニューが追加されます。
その中にシート複製項目がありますので、任意の複製希望シートを選択した状態で、シート複製項目を押します。
押すと、何枚コピーするかメッセージボックスで聞いてきますので、希望枚数を入力します。
すると、プログラムが走って、希望枚数分複製されます。
各関数の意味と流れ(分からなくてOK)
各関数がどういう動きをしているかを解説します。
そんなもんなんだ的な感じで飛ばしてもらってもOKです。
①duplicateActiveSheet(numberOfCopies): 現在選択されているシートを、引数で指定された枚数だけ複製します。
②promptForNumberOfCopies(): メッセージボックスを表示して、複製するシートの枚数を入力させ、その枚数を返します。キャンセルが選択された場合は -1 を返します。
③executeDuplicationProcess(): メッセージボックスで複製するシートの枚数を入力し、入力が正しい場合にシートを複製する処理を実行します。
④onOpen(): スプレッドシートが開かれたときに実行される関数で、スプレッドシートにカスタムメニューを追加します。このメニューには、「シート複製」というアイテムが含まれており、クリックすると executeDuplicationProcess 関数が実行されます。
基本的な流れは次のとおりです。
①ユーザーがスプレッドシートを開くと、onOpen() 関数が実行され、カスタムメニューが追加されます。
②ユーザーが「シート複製」メニューアイテムをクリックすると、executeDuplicationProcess() 関数が実行されます。
③executeDuplicationProcess() 関数内で、promptForNumberOfCopies() 関数が実行され、メッセージボックスが表示され、複製するシートの枚数を入力させます。
④入力が正しい場合、duplicateActiveSheet(numberOfCopies) 関数が実行され、現在選択されているシートが指定された枚数だけ複製されます。
コード解説(分からなくてOK)
適宜コメントを入れていますが、自分も書いていて難しいなと思った所を解説します。
1 2 |
// 複製するシートの名前を配列にまとめる const newSheetNames = Array.from({length: numberOfCopies}, (_, i) => <code>${sheetName} - Copy ${i + 1}</code>); |
Array.fromメソッドを使用して、複製するコピーシート数分メソッドの第2引数で配列を作成しています。=マッピング関数
Mapメソッドみたいな動きをしています。まとめていっぺんにシートが作れるみたいなイメージを持っとけばいいと思います。
1 2 3 4 5 |
// 複製数だけシートを一度に複製 newSheetNames.forEach(name => { const newSheet = activeSheet.copyTo(ss); newSheet.setName(name); }); |
Array.fromメソッドで格納した配列内のコピーシート郡をforEachメソッドで1つずつシート作成名前付けして、複製していく処理を行っています。
アロー関数で省略していますが、配列内に格納されているシートname分複製していきます。
まとめ
以上、「GASでスプレッドシートを任意の枚数複製する方法」についてお伝えしました。
使うだけであれば、コードを有効化すればすぐにでも使用できます。
お手軽なので、お試し下さい。
コメント