見出し画像

【Google Apps Script 通信 vol.8】数式を最終行までコピーしよう!②|複数シートも一括でコピー

こんにちは。きゅうりです。

前回やったこと

1つのシートに対して、指示をした複数の列の数式をコピーするところまでできましたね!

やること

今回は複数シートも一括でコピーできるように進化させていきましょう!

vol4で作成したシート名取得のスクリプトも活用していきます。

使用するスプレッドシート

前回の指示シートにコピー対象のシートを指定する列を追加しましょう。

無題

シート名取得のシートも追加したサンプルを用意したので、ぜひ参考にしてください。

サンプルコード

いつも通りコード内に解説を入れているので、参考にしてください。

// 解説の冒頭に★がついている箇所は後ほど補足します

function Copyformula() {

 // シート情報を取得
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var setSheet = ss.getSheetByName('指示');  
 
 // ★A列の最終行を取得(コピー対象のシート情報を取得)
 var sheetLastRow = setSheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();

 // シート数分 繰り返し
 for (var i = 2; i <= sheetLastRow; i++){
 
   // コピーを実行するシートを取得
   var copySheetName = setSheet.getRange('A'+i).getValue();
   var copySheet = ss.getSheetByName(copySheetName);
     
   //  ★B列の最終行を取得(数式コピーの繰り返し回数を取得)
   var loop = setSheet.getRange(1, 2).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();

   // コピーを実行するシートの最終行を取得
   var copyLastrow = copySheet.getLastRow();
 
   // コピー列数分 繰り返し
   // ※このとき繰り返し変数は前段の繰り返しの【i】と違うものを使う必要があるので注意
   //(同じにするとiの加算がおかしくなり、意図通りに動作しません)
   for (var j = 2; j <= loop; j++){ 
 
     // コピー対象列を取得(コピー対象列の情報が2行目以降のためiは2からスタート)
     var copyCol = setSheet.getRange('B'+j).getValue();
       
     // 2行目の数式を最終行までコピー
     copySheet.getRange(copyCol+'2').copyTo(copySheet.getRange(copyCol+'3:'+copyCol+copyLastrow));
}}}

これで複数シートも一括でコピーできるようになりました!(私の作業も少しは楽になるといいな、、、)

補足|最終行の取得について

上記コード解説に★がついている部分。

// ★A列の最終行を取得(コピー対象のシート情報を取得)
 var sheetLastRow = setSheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();

     
//  ★B列の最終行を取得(数式コピーの繰り返し回数を取得)
 var loop = setSheet.getRange(1, 2).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();

ここでは指示シートのA列、B列それぞれの最終行を取得しています。

無題

これまで最終行を取得するときにはgetLastRow();を使っていましたが、実はこれはシート全体の最終行を取得するコードなのです。

今回の場合はA,B列それぞれの最終行を取得する必要があったので、いつもとは違う方法でアプローチをしています。

このコードの詳細な解説は下記リンクを参照してください。(ちなみに私は詳細まで読んでいません…笑)

スクリプトが完了したら通知してほしい

コピーのスクリプトは完成しました。

でも大きなデータを扱うとなるとその分、実行時間が長くなります。

数秒で終わるものであれば構いませんが数分かかるものだと「終わった?まだ?終わった?」とそわそわしないといけない。そんなの絶対に嫌だ。

というわけで、次回はスクリプトが完了したらSlack通知してくれるように進化させましょう!

この記事が気に入ったらサポートをしてみませんか?