以前の記事で、GASを使ってスプレッドシートのデータを別シートに転記する方法をご紹介しました。
セル範囲やセル内のデータをまとめて取得して、別シートに転記するというとてもシンプルなものでしたね。
取得した範囲のデータが全て必要な場合はこれでも問題ありませんが、実運用では稀なパターンです。
実際には、以下の図のように特定の条件に合ったデータのみを抽出し、それを連続的に転記することの方が多いと思います。
今回は過去記事の応用編として、特定の条件に合ったデータのみを抽出し、かつそれらを連続的に転記する方法についてご紹介します。
- 転記のレパートリーを増やしたい
- 条件に合わせて必要なデータだけを抽出したい
- 抽出したデータを連続的に出力したい
- より実務的な転記方法を知りたい
はじめに
スプレッドシートで最低2枚のシートを用意して下さい。
転記の元となるデータが入力されたシートと転記先のシートがあれば大丈夫です。
今回の例では”【転記元】人事データ” と ”【転記先】抜粋データ”の2つのシートを使用してご紹介します。
転記までの大まかな流れは以下の通りです↓
①スプレッドシートを取得する → ②シートを取得する → ③セル範囲を取得する → ④for文でセル内のデータを順番に取得する → ⑤if文の条件に合った時に転記
サンプルコードと実行結果
まずはサンプルコードです↓
function data_transfer() {
//使用するシートを取得
const ss = SpreadsheetApp.getActiveSpreadsheet(); //アクティブなスプレッドシートを取得
const original_sheet = ss.getSheetByName('【転記元】人事データ'); //転記元のシートを取得
const posted_sheet = ss.getSheetByName('【転記先】抜粋データ'); //転記先のシートを取得
//繰り返しの制御構文
for (let i=2; i<=21; i++){ //変数iを定義
let birthplace = original_sheet.getRange(i,6).getValue(); //F列(出身地)を2行目〜21行目まで順番に見ていく
//条件分岐の制御構文
if (birthplace == "東京"){ //F列(出身地)が東京の場合
let original_values = original_sheet.getRange(i,1,1,7).getValues(); //転記元の範囲(A〜G列)のデータを取得
let lastrow= posted_sheet.getLastRow()+1; //転記先のシートには、データがある行の下に1行追加して
posted_sheet.getRange(lastrow,1,1,7).setValues(original_values); //取得したデータを転記
}
}
}
今回は”【転記元】人事シート”から、出身地が東京の場合のみデータを取得し、”【転記先】抜粋データ”に転記するようにしています。
また、この時のシートフォーマットは転記先のものを使用することにします。
転記元のフォーマットを活かしたい場合は、冒頭でご紹介した過去記事をご参照下さい。
続いて、上のコードを実行した結果です↓
”【転記元】人事データ”から、出身地が東京の場合のみデータが抽出され、上から連続的に転記されていますね。
シートフォーマットも転記元のフォーマットから転記先のフォーマットに変わっているのが分かります。
少しイメージがついたところで、細かく見ていきましょう!
解説① 2つの重要な構文
今回の転記では、『条件にあったデータを抽出すること』と『連続的に出力すること』の2つが重要になります。
ここで登場するのが、いわゆるif文とfor文というやつです。
構文の書き方はこんな感じです↓
if ( 条件式 ) {
//条件式がtrueの時に実行する処理
}
( )内に条件式を記載します。
条件式が満たされる場合、つまりtrueの時に{ }内の処理を実行します。
条件式が満たされない場合、つまりfalseの時は{ }内の処理は実行されず、{ }外の次の処理を実行します。
if文を簡略図で表すと以下のようになります↓
構文の書き方はこんな感じです↓
for (初期化式; 条件式; 増減式) {
//条件式がtrueの時に実行する処理
}
( )内に初期化式、条件式、増減式を記載します。
条件式がtrueの場合、{ }内に記載する処理を繰り返し実行します。
条件式がfalseの場合、{ }内の処理は実行せず、{ }の外に抜け出すことで繰り返し処理は終了となります。
for文を簡略図で表すと以下のようになります。
解説② if文で条件に合ったデータのみを取得する
上のコードの中で、条件分岐の制御構文は以下の部分です↓
//条件分岐の制御構文
if (birthplace == "東京"){ //F列(出身地)が東京の場合
let original_values = original_sheet.getRange(i,1,1,7).getValues(); //転記元の範囲(A〜G列)のデータを取得
let lastrow= posted_sheet.getLastRow()+1; //転記先のシートには、データがある行の下に1行追加して
posted_sheet.getRange(lastrow,1,1,7).setValues(original_values); //取得したデータを転記
}
条件式はbirthplace==”東京”としました。
birthplaceという変数は、条件分岐の制御構文の前の行で”転記元のF列に入っているデータ”と定義しています。
つまり条件式は”転記元のF列に入っているデータが東京の場合”となります。
この条件式がtrueの場合、つまりF列に東京と書いていたときの処理は3つです。
- はじめに、東京と記載されている行のデータ(A〜G列)を丸々抽出します。
- 次に、転記先シートのデータが入っている行の1行下を取得します。これで既にデータが入力されている行への転記を防ぎます。
- 最後に、2つ目の処理で取得した行に1つ目の処理で抽出したデータを転記します。
ここで出身地が東京であるかを判断し転記が行われているということです。
解説③ for文で連続的に転記する
上のコードの中で、繰り返し処理の制御構文は以下の部分です↓
//繰り返しの制御構文
for (let i=2; i<=21; i++){ //変数iを定義
let birthplace = original_sheet.getRange(i,6).getValue(); //F列(出身地)を2行目〜21行目まで順番に見ていく
//今回はここにif文を記載
}
( )内でiという変数を定義し、初期化式、条件式、増減式を記載しています。
要約すると、”最初にi=2として、iが21以下の時は{ }内の処理を実行し、{ }内の処理を実行したらiに1を加える”という制御構文です。
条件式がtrueの場合、つまり変数iが21以下のときの処理は2つです。
- 転記元シートのF列のデータを2行目〜21行目まで順番に取得します
- if文を実施します
getRange()の行番号部分に変数iを与え、iを2〜21にすることで、2行目〜21行目のデータを順番に見ていけるということです。
また、for文の中にif文を記載することで、if文の条件に合った時のみ転記を繰り返すようにしています。
まとめ
今回は、『GASのif文とfor文を使って必要なデータのみを連続的に転記する方法』をご紹介しました。
より実務的な転記が可能になりますよね?
また、if文、for文を扱えるようになることで、転記以外にも様々なことが行えるようになります。
条件式さえ理解できれば簡単に実行出来るので、ぜひ試してみて下さい!
コメント