見出し画像

ID通知書:「繰り返し」と「条件」をつかった事例【GAS】【Googleスプレッドシート】【関数】

繰り返しと条件は、あらゆるプログラムの基本

以前の記事では、google apps scriptを使って、セルの値を操作してみました。セルからセルに値を転記してみて、実際にスクリプトが動いているのを体感できたと思います。

「条件」と「繰り返し」は、いろいろなプログラムの基本になる考え方です。具体的な事例を紹介していきたいと思います。

ID通知書の発行フォーム

トップ画面のような通知書を作成するとき、複数の項目にそれぞれの情報を転記する必要があります。
手作業だと、ほかの人の情報を入力してしまったり、違う項目に入力してしまったりして、ミスも多くなります。そういう業務はスクリプトに代行させることができます。

スプレッドシートの設計

まずは、図のように、「リスト」と「フォーマット」を準備します。
例のように発行番号「7」いのうえさんのID通知書を、スクリプトで作成します。
スクリプトです。「取得」⇒「貼り付け」を4か所対応させました。

function myFunction1() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 
  var shimei =sheet.getRange(8,2,1,1).getValue(); //①の取得
  var id = sheet.getRange(8,3,1,1).getValue();   //②の取得
  var pass = sheet.getRange(8,4,1,1).getValue();  //③の取得
  var tantou = sheet.getRange(8,5,1,1).getValue(); //④の取得

  sheet.getRange(4,9,1,1).setValue(shimei); //①の貼り付け
  sheet.getRange(6,10,1,1).setValue(id);    //②の貼り付け
  sheet.getRange(7,10,1,1).setValue(pass);  //③の貼り付け
  sheet.getRange(11,11,1,1).setValue(tantou);//④の貼り付け
}

こちら、数が増えてますが基本となる考え方は、「【最初の最初】getRange、getValue,setValue」の記事の通りです。
こえはすべての値が決まっており、変動化した結果を表すことはできません。

指定値が「7」であれば、「7」のデータを転記したい

ということですよね。
ここで構文を簡素化するために、①だけに絞ったスクリプトで考えていきますね。

function myFunction2() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 
  var shimei =sheet.getRange(8,2,1,1).getValue(); //①の取得
  
  sheet.getRange(4,9,1,1).setValue(shimei); //①の貼り付け  
}

getRange(8,2,1,1)がコピー元、getRange(4,9,1,1)コピー先 です。
今回は、コピー先は変更なく、コピー元がgetRange(〇,2,1,1)、〇が指定番号で変更されるように指定したいです。

変数の指定を指定しないといけないので構文をいじってみる

function myFunction3() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 
  var num = 8

  var shimei =sheet.getRange(num,2,1,1).getValue(); //①の取得
  
  sheet.getRange(4,9,1,1).setValue(shimei); //①の貼り付け
  
}

getRange(8,2,1,1) を getRange(num,2,1,1) として、num は8という風に書き換えました。こちらでも動作結果は変わりません。日本語で表現すると

指定された7があるのは8行目なので、numを8にして、値を取得する

という感じだと思います。ここまでは大丈夫でしょうか。
次が少し厄介ややこしい表現になりますが、考えてみましょう。

関数で言うと、MATCH関数に近い

指定値7は、一定の範囲内でどう表現できるか というのをスクリプトで記載します。先ほどまでの関数と別で、serch というものを作成しました。

function serch(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
for(y=2;y<=11;y++){
  var data = 7 ;
  var value = sheet.getRange(y,1,1,1).getValue();
   if(value == data){ 
    return y
      }}}

for(y=2;y<=11;y++)
{ なんちゃら }

これが繰り返し構文です。こう記載すると、
「なんちゃら」を y=2、y=3、y=4、、、y=11 にして(10回)繰り返しなさい というプログラムになります。
本文では
var value = sheet.getRange(y,1,1,1).getValue() に yが入っているので、
getRange(2,1,1,1)の値
getRange(3,1,1,1)の値
getRange(4,1,1,1)の値
・・・
getRange(11,1,1,1)の値
を順番に取得しています。(※setValueがないので、シート上の見た目は変わりません。)繰り返すだけだと、次に進めません。ほしいのは「7」のときですよね。

if(value == data)
{ return y }

この表現は、セルの値が、指定値と一致したらそのときのyを返すとなります。
このyが、結果的にはさきほどのnumにほりこめれば、大体できたようなものです。

function myFunction4() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 
  var num = serch()

  var shimei =sheet.getRange(num,2,1,1).getValue(); //①の取得
  
  sheet.getRange(4,9,1,1).setValue(shimei); //①の貼り付け
  
}

これで本文が完成しました。

最後に、serch の値を、
var data = sheet.getRange(3,11,1,1).getValue(); に変更
本文に②③④を記載して完成です。

function serch2(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
for(y=2;y<=11;y++){
  var data = sheet.getRange(3,11,1,1).getValue();
  var value = sheet.getRange(y,1,1,1).getValue();
   if(value == data){ 
     return y
     
      }}}

function myFunction5() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 
  var num = serch2()

  var shimei =sheet.getRange(num,2,1,1).getValue(); //①の取得
  var id = sheet.getRange(num,3,1,1).getValue();   //②の取得
  var pass = sheet.getRange(num,4,1,1).getValue();  //③の取得
  var tantou = sheet.getRange(num,5,1,1).getValue(); //④の取得

  sheet.getRange(4,9,1,1).setValue(shimei); //①の貼り付け
  sheet.getRange(6,10,1,1).setValue(id);    //②の貼り付け
  sheet.getRange(7,10,1,1).setValue(pass);  //③の貼り付け
  sheet.getRange(11,11,1,1).setValue(tantou);//④の貼り付け

  
}

まとめ

いかがでしたでしょうか?単純に「あのセルからこのセル」に比べると、複雑性は格段に上がったかと思います。
素材は単純ですので、一つ一つ読み解いてみてくださいませ。

関数で再現できます。

ちなみに、こちらのスクリプトですが、「VLOOKUP関数」を使えば、再現できます。
併用してもいいと思います。スクリプトを使うメリットは、「このデータをPDFにして、メールで個別送信する」というような発展性があるところですね!

今回のシートです。
https://docs.google.com/spreadsheets/d/108xEEu4HpA5M9aiY0OALYtSdkWomvt793VjlOaEyEDU/edit#gid=1145648161

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