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にして、メールで個別送信する」というような発展性があるところですね!