見出し画像

事業ごとに情報を振り分ける:「繰り返し」をつかった事例【GAS】【Googleスプレッドシート】【関数】

今回は繰り返しだけを使っています。

getRange,ssetValue ただのセルからセルへの転記を繰り返しを使って実践化してみました。
作業結果のイメージは、売上やKPIなど、まとめて管理しているものをそれぞれに振り分けていくイメージです。

これが振り分け元
振り替えてこのようにしたい

基本の基本だけの場合

1行を転記するのに必要なコードは下記のとおりです。

function myFunction() {
 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

 var kyaku_a_1 = sheet.getRange(3,3,1,1).getValue();
 var kyaku_a_2 = sheet.getRange(3,4,1,1).getValue();
 var kyaku_a_3 = sheet.getRange(3,5,1,1).getValue();
 var kyaku_a_4 = sheet.getRange(3,6,1,1).getValue();

 sheet.getRange(3,9,1,1).setValue(kyaku_a_1);
 sheet.getRange(3,10,1,1).setValue(kyaku_a_2);
 sheet.getRange(3,11,1,1).setValue(kyaku_a_3);
 sheet.getRange(3,12,1,1).setValue(kyaku_a_4);
}

ひとセルずつ取得すると、一行につき4セル。取得と貼り付けの構文で作成できますね。これが基本となり、図のイメージだと、8行あるので、あと8組作ることで稼働します。
少し、勝手が悪いので、まとめてみましょう。

転記元:x 転記先:yとして、記載を変えてみます。

function kai_1(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var x=3 
var y=30

var kyaku_1 =  sheet.getRange(x,3,1,1).getValue();
var kyaku_2 =  sheet.getRange(x,4,1,1).getValue();
var kyaku_3 =  sheet.getRange(x,5,1,1).getValue();
var kyaku_4 =  sheet.getRange(x,6,1,1).getValue();

sheet .getRange(y,9,1,1).setValue(kyaku_1)
sheet .getRange(y,10,1,1).setValue(kyaku_2)
sheet .getRange(y,11,1,1).setValue(kyaku_3)
sheet .getRange(y,12,1,1).setValue(kyaku_4)

}

こちらのコードでは、「転記元:3行目 ・ 転記先:30行目」という指定になります。
いちいち取り出した値を変数化する必要もないので、まとめてみました。

function kai_2(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var x=3 
var y=30

sheet .getRange(y,9,1,1).setValue(sheet.getRange(x,3,1,1).getValue())
sheet .getRange(y,10,1,1).setValue(sheet.getRange(x,4,1,1).getValue())
sheet .getRange(y,11,1,1).setValue(sheet.getRange(x,5,1,1).getValue())
sheet .getRange(y,12,1,1).setValue(sheet.getRange(x,6,1,1).getValue())

}

ここで、転記元は「3,4,5,6」、転記先「9,10,11,12」と繰り返しになりそうなところが見えてきました。

まずは、転記元を繰り返しにする


function kai_3(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var x=3 
var y=30

for(i=3;i<=6;i++)
sheet .getRange(y,9,1,1).setValue(sheet.getRange(x,i,1,1).getValue())

}

繰り返し、for ( ){ } の構文です。変数をiと指定して、「3,4,5,6」を繰り返します。

次に、転記先も繰り返しにする

function kai_4(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var x=3 
var y=30

for(i=3;i<=6;i++)
sheet .getRange(y,i+6,1,1).setValue(sheet.getRange(x,i,1,1).getValue())

}

「3,4,5,6,」と「9,10,11,12」の対応は「+6」で対応するので、同じ構文内での記載が可能でした。
では、次に変数を使って構造化してみます。

変数を使って構造化してみる

転記元と転記先の行の対応表です。

3行目 ⇒ 3行目
10行目 ⇒ 4行目
という取り決めで作業を繰り返していきますが、その対応をまとめたものです。ここから、法則性が見つけ出せれば、構造化できます。
今回の表は定型同士の組替になるので、その法則を言語化します。

回数に対応した行数の指定

お客数の表と単価の表では、おなじ計算式で表すことができなかったので、違う構文を作成しないといけません。

お客様の表を転記する構文

先ほど作った構文では、x = 3 , y = 30 という具体的な事例で作成しました。
それを、それぞれの計算式で作成し、繰り返し構文で記載を行います。
var x=3+n*1-1
var y=3+n*5-5

function kyaku(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

for(n=1;n<=4;n++){

var x=3+n*1-1
var y=3+n*5-5

for(i=3;i<=6;i++)
sheet .getRange(y,i+6,1,1).setValue(sheet.getRange(x,i,1,1).getValue())

}
}

単価の表を転記する構文

var x=10+n*1-1
var y=4+n*5-5

function tanka(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

for(n=1;n<=4;n++){

var x=10+n*1-1
var y=4+n*5-5

for(i=3;i<=6;i++)
sheet .getRange(y,i+6,1,1).setValue(sheet.getRange(x,i,1,1).getValue())

}
}

繰り返しの中に繰り返しを入れて完成しました。
この状態で、「tanka」「kyaku」それぞれ起動させればアクションが実行されます。

二つの関数を一緒にする

1.構文内で記載を合併する

今回、「tanka」「kyaku」構造的には近しいです。変数としては n が軸となし、1~4に変わる動きに対応して動作します。
ただし、x,yがそれぞれ違う動きをするのでそこの区分けをします。
「p」「q」を新しく作成しました。

function kyakumotankamo(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

for(n=1;n<=4;n++){

var x=10+n*1-1
var y=4+n*5-5
var p=3+n*1-1
var q=3+n*5-5

for(i=3;i<=6;i++){
sheet .getRange(y,i+6,1,1).setValue(sheet.getRange(x,i,1,1).getValue());

sheet .getRange(q,i+6,1,1).setValue(sheet.getRange(p,i,1,1).getValue());

}
}
}

「kyakumotankamo」の起動で完結するようになりました。

2.上位の関数を作る

function dottimo(){

tanka()
kyaku()

}

「dottimo」を起動すると、「tanka」「kyaku」が起動します。

まとめ

今回の事例を拡大していけば、表を3つや4つ、行列も増やしても対応することができます。
発展形としては、違うシートに転記することもできます。
そうすればより実務で活用できるイメージにちかくなるのではないでしょうか。
アルゴリズムを導き出して、大量の作業を自動化させれば効率化、ミス撲滅につながります。
しかしながら、実務上は定型のように見えて、「例外」が潜んでいるケースもあると思います。
次回は簡単な対応策をご案内したいと思います。


今回のシートです。

https://docs.google.com/spreadsheets/d/1xQ_uZiZBIqCOnBcdCLiya8gd9rKg1rQxhvRP2QJPeA4/edit#gid=585579292


どんな記事ならサポートしてみようと思えるか、ご要望ありましたら教えてくださいね。