episode7 GAS【平均・条件該当数のカウント】キャラの身長で演算「HUNTER×HUNTERで覚えるGoogle Apps Script」

この記事を読むことによって、GAS(Google Apps Script)で計算結果を格納する方法を学べます。今回は平均を求めるAVERAGEと条件に該当する人数を数えるCOUNTIF関数を使います。また、文字入力の復習も出来ます。

Excelの関数に慣れている方でしたら掴みやすいかもしれません。



今回は、この一つ右のセルにキャラクターの身長を入力して、平均を求めてみたいと思います。(下の表のD列にゴンからレオリオまでの身長を入れました。)

それで、まずはこの表の下のセルA6に「平均」といいう文字を入れてみます。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//身長の平均と170cm以上の人数を求める関数
function height(){
  ss.getRange(6,1).setValue('平均');
}

この様に文字が入りました。

また、この1つ下のセルA7に「170cm以上の人数」の文字を入れます。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//身長の平均と170cm以上の人数を求める関数
function height(){
  ss.getRange(6,1).setValue('平均');
  ss.getRange(7,1).setValue('170cm以上の人数');
}

少しA列を広げました。

今度は、セルB6に平均身長を求めます。

ss.getRange(6,2).setFormula(‘=AVERAGE(D1:D4)’);

この様に、setFormula(‘=関数(セル範囲)’);で求まります。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//身長の平均と170cm以上の人数を求める関数
function height(){
  ss.getRange(6,1).setValue('平均');
  ss.getRange(7,1).setValue('170cm以上の人数');

  //平均身長を計算
  ss.getRange(6,2).setFormula('=AVERAGE(D1:D4)');
}

最後に、セルB7に身長が170cm以上のキャラクターの人数を求めます。

ss.getRange(7,2).setFormula(‘=COUNTIF(D1:D4,”>=170″)’);

この様に、setFormula(‘COUNTIF関数(=セル範囲,”カウントする条件”)’);で求まります。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//身長の平均と170cm以上の人数を求める関数
function height(){
  ss.getRange(6,1).setValue('平均');
  ss.getRange(7,1).setValue('170cm以上の人数');

  //平均身長を計算
  ss.getRange(6,2).setFormula('=AVERAGE(D1:D4)');

  //身長が170cm以上のキャラクターの人数を求める
  ss.getRange(7,2).setFormula('=COUNTIF(D1:D4,">=170")');
}

この様に、求まりました。ご精読ありがとうございました。

←episode6               episode8(最終回)→

←GAS自作集サンプルへ戻る

episode6 GAS【指定セル範囲に色付け】「HUNTER×HUNTERで覚えるGoogle Apps Script」

この記事のシリーズを読むことで、アニメHUNTER×HUNTER(ハンターハンター)を通してGAS(Google Apps Script)の最初の一歩が学べます。

この記事では、

・色を付けたい範囲の指定方法

・文字の色とセルの塗り潰しの色を指定

・色の英語名と16進数を使用

についての概要を掴めます。


今回は、この表に色を付けます。
完成形のイメージは、この様な厨二病っぽい感じにしたいと思います。

各キャラクターの名前(列A)と念系統(列B)を黒背景に白文字に、
ヒソカチェックの列(列C)は、紫にします。

列ABの4行2列分の範囲をcharaNenと定義します。

//A列B列の名前と念系統が入っているセル範囲をcharaNenと定義
const charaNen=ss.getRange(1,1,4,2);

背景色を黒にしています。
色は英語名で指定出来ます。

charaNen.setBackground('black');

文字の色を白にしています。

charaNen.setFontColor('white');

列Cの4行1列分の範囲をhisokaCheckという名前にします。
1列分の場合は、列は略せますので、(1,3,4)として、(1,3)でセルC1,4で4行を取得しております。

//C列のヒソカチェックのセル範囲をhisokaCheckと定義
const hisokaCheck=ss.getRange(1,3,4);

色は英語名の他に、16進数で更に細かく指定出来ます。
ヒソカチェックの所は16進数で色を指定するので、ここで、16進数を用いての色の表し方について触れさせて頂きます。

・白… ffffff

・黒…000000

・最初の2桁が赤、次が緑、最後が青

以上より薄紫を[#eeddee]で表しました。
このコードでは、赤と青を強めにしていて、薄い紫になります。

cellHISOKA.setBackground('#eeddee');

参考までに色見本です。

ここまでのコードです。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//セルの背景とフォントを変える
function rookieColor() {

  //A列のキャラ名とB列の念の入っている範囲をcharaNenとする
  const charaNen=ss.getRange(1,1,4,2);

  //背景色を黒にする
  charaNen.setBackground('black');

  //文字色を白にする
  charaNen.setFontColor('white');

  //C列のヒソカチェックの範囲をhisokaCheckとする
  const hisokaCheck=ss.getRange(1,3,4);

  //背景を薄紫にする
  hisokaCheck.setBackground('#eeddee');

}

お疲れ様でした。ブレイクタイムPhotoは、

横浜ランドマークタワーとクルーズ船のみなとみらいの夜景です。

←episode5               episode7→

←GAS自作集サンプルへ戻る

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

初めてのGoogle Apps Scriptに戻る
写真クリエイターとしての活動

自己紹介

episode5 GAS【指定セル範囲のフォント変更】「HUNTER×HUNTERで覚えるGoogle Apps Script」

この記事のシリーズを読むことで、アニメHUNTER×HUNTER(ハンターハンター)を通してGAS(Google Apps Script)の最初の一歩が学べます。

今回の記事では、

・指定の範囲の文字を太字

・フォントサイズの変更

・最終行のgetLastRow()の復習

についての概要が掴めます。


今回は、この様なシートを用意しました。
この表のA列にある「ゴン〜レオリオ」までのキャラのフォントを変えます。

キャラの名前が掲載されている範囲は、セルA1からA4までになります。
この範囲を太字で12ptにします。

キャラクターの人数をN(人)として、getLastRowで取得します。

const N=ss.getLastRow();

範囲に「cellROOKIE(ルーキー)」と名前を付けて、大きさを変える範囲を確保します。

let cellROOKIE=ss.getRange(1,1,N);

(1,1,N)は、セルA1(1,1)からN行分の範囲という意味です。
これで、キャラクターが増えても対応可能です。

この範囲にフォントの大きさを12ptで太字にする設定を下記のコードに施します。

cellROOKIE.setFontSize(12).setFontWeight(‘bold’);

ここまでのコードです。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//行数(人数)を取得する
const N=ss.getLastRow();

//キャラクターの名前を12ptの太字にする
function bold12pt(){

  let cellROOKIE=ss.getRange(1,1,N);
  cellROOKIE.setFontSize(12).setFontWeight('bold');
  
}

ここでボタンに関数「bold12pt」をスクリプトを割り当てで割り当てます。
実行すると、

この様に、キャラクターの名前がフォント12の太字になりました。



5行目の

const N=ss.getLastRow();

で、最終行を取得しているので、キャラクターの名前が増えても対応可能です。
この様に少し増やしてみます。

「新人潰しのトンパさん〜アモリ三兄弟」まで追加しました。
再度実行してみます。

これで全員の名前が太字になりました。

←episode4               episode6→

←GAS自作サンプル集へ戻る

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

お疲れ様でした。ブレイクタイムPhotoは、

横浜みなとみらいの夜景です。
コスモクロック21と、ヨコハマ グランド インターコンチネンタル ホテルです。

HUNTER×HUNTERのGAS自作サンプル集のページに戻る
初めてのGASに戻る


自己紹介

episode4 GAS【IFとループ】ヒソカの念チェック「HUNTER×HUNTERで覚えるGoogle Apps Script」

この記事のシリーズを読むことで、アニメHUNTER×HUNTER(ハンターハンター)を通してGAS(Google Apps Script)の最初の一歩が学べます。

この記事では、

・GASによるIF分岐とループでヒソカと同じ念系統か調べる

・配列で処理時間を短縮

・最後の行をgetLastRow()で求める

SpreadSheetApp→アクティブシート→アクティブセルと階層を辿ることによって処理時間がかかってしまうことを空の配列を用意することで解決する方法を掲載しています。

GASでは配列の扱いがとても重要になります。

ますは、前回(episode3)の復習をします。

・セルA1からB4にキャラクター名を入力する関数と消去する関数を作り、それぞれをボタンに登録しました。

//アクティブなスプレッドシートを選択するグローバル領域
const ss=SpreadsheetApp.getActiveSheet();


//スプレッドシートにキャラクターの名前と念系統の入った配列を出力する
function nenArray(){

  //二次元配列hhにキャラクターの名前と念系統を格納
  const hh = [
      ['ゴン','強化系'],
      ['キルア','変化系'],
      ['クラピカ','具現化系'],
      ['レオリオ','放出系']
    ];
  
  //配列hhをログに出力
  console.log(hh);

  //行の長さを調べる
  console.log(hh.length);

  //列の長さを調べる
  console.log(hh[0].length);

  //二次元配列hhを格納するために、スプレッドシートの4行2列を確保して出力する
  ss.getRange(1,1,hh.length,hh[0].length).setValues(hh);

}


//出力した配列を消去する
function myClear() {

  //出力した配列をgetDataRangeを使って取得して消去する
  ss.getDataRange().clear();

}

実行するとこの様になっていると思います。

ヒソカの念は「変化系」でキルアと一緒です。


今回はIF文を使って、ゴンからレオリオまでのキャラの念が、ヒソカと同じ変化系かどうか調べます。

ゴンは「強化系」なので「変化系」とは異なる為、条件が当てはまらないelseへと分岐します。

ゴンの念が入力されているセル「B1」は「1行目の2列目」ですので、(行,列)で書くと(1,2)と書くことも出来ます。

処理はelseになる為、隣のセルである「C1 (1,3)」には「XXX」と入力されます。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();


//【ゴン】がヒソカと同じ念系統か判定する関数
function Hisoka() {
  let nen = ss.getRange(1,2).getValue(); //ゴンの念を取得
  console.log(nen);
  
  //【ゴン】の念はヒソカと同じ「変化系」か?
  if(nen=='変化系'){
    ss.getRange(1,3).setValue('ヒソカと一緒');
  }else{
    ss.getRange(1,3).setValue('XXX'); //違うからこっちに分岐
  }
}

ログ出力です。
ゴンの念系統「強化系」が出力されました。

スプレッドシートです。
C1に「XXX」と入りました。


次に、「キルア」を調べます。

キルアは「変化系」なので、「ヒソカ」と同じという条件が当てはまり「ヒソカと一緒」と表示されます。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();


//【キルア】がヒソカと同じ念系統か判定する関数
function Hisoka() {
  let nen = ss.getRange(2,2).getValue(); //キルアの念を取得
  console.log(nen);
  
  //【キルア】の念はヒソカと同じ「変化系」か?
  if(nen=='変化系'){
    ss.getRange(2,3).setValue('ヒソカと一緒'); //同じだからこっちに分岐
  }else{
    ss.getRange(2,3).setValue('XXX'); 
  }
}

ログ出力です。

スプレッドシートです。
キルアの念はヒソカと同じなので、セルC2に「ヒソカと一緒」と入力されました。


次に、「クラピカ」を調べます。

クラピカは「具現化系」なので、「変化系」とは異なる為、条件が当てはまらないelseへと分岐します。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();


//【クラピカ】がヒソカと同じ念系統か判定する関数
function Hisoka() {
  let nen = ss.getRange(3,2).getValue(); //クラピカの念を取得
  console.log(nen);
  
  //【クラピカ】の念はヒソカと同じ「変化系」か?
  if(nen=='変化系'){
    ss.getRange(3,3).setValue('ヒソカと一緒'); 
  }else{
    ss.getRange(3,3).setValue('XXX'); //違うからこっちに分岐
  }
}

ログ出力です。

スプレッドシートです。
ヒソカとは念が異なるので、C3に「XXX」と入力されました。


最後に、「レオリオ」を調べます。
レオリオは「放出系」なので、ヒソカの「変化系」とは異なる為、条件が当てはまらないelseへと分岐します。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();


//【レオリオ】がヒソカと同じ念系統か判定
function Hisoka(){
  let nen=ss.getRange(4,2).getValue();  //レオリオの念を取得
  
  //【レオリオ】の念はヒソカと同じ「変化系」か?
  if(nen=='変化系'){                      
    ss.getRange(4,3).setValue('ヒソカと一緒');
    }else{
    ss.getRange(4,3).setValue('XXX'); //違うからこっちに分岐
  }
}

ログ出力です。
レオリオの「放出系」が出力されました。

スプレッドシートではC4に「XXX」と出力してelseの処理を実行しました。


ここまでで、「なんだか同じような処理をしていて、それで一部だけを変更している」と言う感覚になられたと思います。

上記のコードで「i」の部分のみを変えています。
そこで、ゴンからレオリオまでを繰り返して調べられる、Forによるループを使います。

getRange(i,2)getValue(); //キャラの念を取得 
getRange(i,3)setValue(‘ヒソカと同じか違うか’)      

実はここまでの記事で、ループのトレースを行えておりました。

追加としては、

ゴン・・・i=1
キルア・・・i=2
クラピカ・・・i=3
レオリオ・・・i=4

と、変数が出てくるぐらいです。

なぜ「i」なのか、それは、ループで慣習的に使う変数として、「i、j、k」がよく使われるからです。

このことについては、「なぜ、新人つぶしのトンパさんは、トンパさんという名前なのか」と突き詰めてしまうことの様なものなので、ループではiとかを使うんだな、程度に捉えておりましたが、やはり気になって調べた所、分かりやすい記事を見つけました。

「i, j, k」ってなに?知っておきたいfor文の変数名の由来


ゴン〜レオリオまでメンバーは4人ですので、その人数を調べるために、変数Nに「getLastRow()」(最後の行)を調べて格納します。

最後の行…getLastRow();

以上を踏まえてループとIFを使ったコードを書くと、下記の様になります。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();


//【メンバー】がヒソカと同じ念系統か判定する関数
function Hisoka() {

  const N = ss.getLastRow(); //人数は変数Nに格納。この場合は4人
  console.log(N);

  for(i=1;i<=N;i++){
    let nen = ss.getRange(i,2).getValue(); //メンバーの念を取得
    console.log(nen);
  
    //【メンバー】の念はヒソカと同じ「変化系」か?
    if(nen=='変化系'){
      ss.getRange(i,3).setValue('ヒソカと一緒'); //キルアの場合
    }else{
      ss.getRange(i,3).setValue('XXX'); //キルア以外
    }
  }
}

ログ出力です。
スプレッドシートには同様に出力されております。

この「Hisoka」をボタンの「スクリプトを割り当て」でボタンに登録します。
ボタンを右クリックして3点リーダーから登録します。


また、下記のコードで、ヒソカと念が同じかどうか調べた範囲の判定結果を削除します。

//ヒソカチェックのクリア
function HisokaClear(){
  
  //行数を取得して変数Nに人数を格納
  const N=ss.getLastRow();

  ss.getRange(1,3,N).clear();
}

一旦ここまでのコードをまとめます。
人数の行数をは判定もクリアも同じ4人でNですので、グローバル領域に移動しました。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//行数(人数)を取得する
const N=ss.getLastRow();
// console.log(N); 確認済みなのでコメントアウトしました。


//【メンバー】がヒソカと同じ念系統か判定する関数
function Hisoka() {

  for(i=1;i<=N;i++){
    let nen = ss.getRange(i,2).getValue(); //メンバーの念を取得
    // console.log(nen); 確認済みなのでコメントアウトしました。
  
    //【メンバー】の念はヒソカと同じ「変化系」か?
    if(nen=='変化系'){
      ss.getRange(i,3).setValue('ヒソカと一緒'); //キルアの場合
    }else{
      ss.getRange(i,3).setValue('XXX'); //キルア以外
    }
  }
}

//ヒソカチェックのクリア
function HisokaClear(){
  
  ss.getRange(1,3,N).clear();
}

紫のボタン「ヒソカチェック」に関数「Hisoka」を、灰色のボタン「ヒソ消し」に関数「HisokaClear」それぞれスクリプトを割り当てます。

これで、ボタンを使って、判定したり消したりが出来る様になりました。
現在、ヒソ消しを押して、判定の列は削除してあります。


このままでも良いのですが、GASでループを使う場合、1回1回SpreadsheetAppからアクティブシートを辿ってしまうので処理に時間がかかってしまいます。

そこで、一旦B列4行分の各メンバーの念系統を配列arrayに格納します。
配列arrayには[[‘強化系’],[‘変化系’],[‘具現化系’],[‘放出系’]]が入ります。

また、そのメンバーの念系統がヒソカの変化系と等しいかどうかの判定結果を格納する配列judgeを用意します。
配列arrayには[[‘XXX’],[‘ヒソカと一緒’],[‘XXX’],[‘XXX’]]が入ります。

それぞれの空の配列を用意しております。

//【メンバー】の念を格納する配列を宣言
  let array=[];

//変化系と等しいか判定結果を入れる配列
  let judge=[];

配列arrayを使って、念系統がヒソカと同じ変化系かどうか調べて、その判定結果を配列judgeに格納する処理にループを用います。
また、judgeに格納するときにpushを使います。

この配列を使うことによって、スプレッドシートからアクティブシートに階層を辿って行く処理時間を短縮できます。

ここまでの処理について、ログ出力のところまでのコードを掲載致しました。
配列は0から始まるので、ループの条件部分を修正しました。

i=0、i<Nと変更してあります。

また、配列judgeに入れる際、スプレッドシートに出力するのに二次元配列の形にするので、と[ ]を付けて配列に追加しております。

judge.push([‘ヒソカと一緒’]) → ifでキルアの念系統の場合

judge.push([‘XXX’]) → elseでキルア以外のメンバーの念系統の場合


その部分のコードの抜粋です。

//【メンバー】の念はヒソカと同じ「変化系」か?
    if(array[[i]]=='変化系'){
      judge.push(['ヒソカと一緒']); //キルアの場合
    }else{
      judge.push(['XXX']); //キルア以外
    }

ここまでのログ出力までのコードです。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//行数(人数)を取得する
const N=ss.getLastRow();


//【メンバー】がヒソカと同じ念系統か判定する関数
function Hisoka() {

  let array= [];
  let judge = [];

  //B列の各メンバーの念を配列arrayに格納
  array=ss.getRange(1,2,N).getValues();
  console.log(array);

  for(i=0;i<N;i++){
   
    //【メンバー】の念はヒソカと同じ「変化系」か?
    if(array[[i]]=='変化系'){
      judge.push(['ヒソカと一緒']); //キルアの場合
    }else{
      judge.push(['XXX']); //キルア以外
    }
  }
  console.log(judge);

}

配列arrayとヒソカの念との比較のログを出力しました。

【配列array】


【配列judge】

この後、配列judgeをスプレッドシートのC列に4行分書き出します。
関数Hisokaにこの2行を加えたのみです。

//スプレッドシートC列4行分に判定結果の入った配列judgeごと入力する。
  ss.getRange(1,3,N).setValues(judge);

ここまでのコードをまとめました。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//行数(人数)を取得する
const N=ss.getLastRow();


//【メンバー】がヒソカと同じ念系統か判定する関数
function Hisoka() {

  let array= [];
  let judge = [];

  //B列の各メンバーの念を配列arrayに格納
  array=ss.getRange(1,2,N).getValues();
  console.log(array);

  for(i=0;i<N;i++){
   
    //【メンバー】の念はヒソカと同じ「変化系」か?
    if(array[[i]]=='変化系'){
      judge.push(['ヒソカと一緒']); //キルアの場合
    }else{
      judge.push(['XXX']); //キルア以外
    }
  }
  console.log(judge);

  //スプレッドシートC列4行分に判定結果の入った配列judgeごと入力する。
  ss.getRange(1,3,N).setValues(judge);
}

//ヒソカチェックのクリア
function HisokaClear(){
  
  ss.getRange(1,3,N).clear();
}

お疲れ様でした。ブレイクタイムPhotoは、

横浜の夜景です。
思わずこの歌を歌いたくなりました。

←episode3               episode5→

←GAS自作サンプル集へ戻る

HUNTER×HUNTERのGAS自作サンプル集のページに戻る
初めてのGASに戻る


自己紹介

episode3 GAS【二次元配列は団地!!】範囲指定でまとめて入力「HUNTER×HUNTERで覚えるGoogle Apps Script」

この記事のシリーズを読むことで、アニメHUNTER×HUNTER(ハンターハンター)を通してGAS(Google Apps Script)の最初の一歩が学べます。

この記事では、

・配列は「0:ゴン」、「1:キルア」、「2:クラピカ」、「3:レオリオ」のイメージ

・配列を団地に例えて「キャラクター」と「念能力」の二次元配列を作成

・配列の長さをlengthを使って求め、同じ長さ分の行と列をスプレットシートに確保して配列を出力

についての概要を掴めます。

この記事で作成する配列は、キャラクター4人分の「キャラ名」と「念能力」を格納する4行2列の配列です。

シートに出力する関数、消去する関数の2つを作って、それぞれボタンに割り当て(登録)します。

また、シートに入力されている範囲をgetDataRangeで配列として扱えます。

まずは前回(episode2)の復習をします。

・セルA1に「ハンターハンター」と入力する関数と消去する関数を作り、それぞれをボタンに登録しました。

//アクティブなスプレッドシートを選択するグローバル(キャラ共通の処理)
const ss=SpreadsheetApp.getActiveSheet();


//入力とログ出力をする関数(ゴンさんの家)
function myInput() {
  
  //セル入力
  ss.getRange(1,1).setValue('ハンターハンター');

  //ログ出力
  console.log(ss.getRange(1,1).getValue());

}


//消去する関数(キルアさんの家)
function myClear() {

  //セルA1を消去
  ss.getRange(1,1).clear();

}

それでは、ここから配列にキャラクターの名前と念能力を格納していきます。

二次元配列に格納するするデータは、

「ゴン」「強化系」
「キルア」「変化系」
「クラピカ」「具現化系」
「レオリオ」「放出系」

です。

スプレッドシートはExcelの様に行と列の二次元ですので、二次元配列を使って入力します。

二次元配列や配列と聞くと難しそうですが、イメージは「団地(マンションでも)」です。

配列は添字0から始まります。

0階・・・ゴン(00号室に「ゴンの名前」 、01号室に「ゴンの強化系」)

1階・・・キルア(10号室に「キルアの名前」 、11号室に「キルアの変化系」)

2階・・・クラピカ(20号室に「クラピカの名前」 、21号室に「クラピカの具現化系」)

3階・・・レオリオ(30号室に「レオリオの名前」 、31号室に「レオリオの放出系」)

というイメージで二次元配列を「団地」と捉えると、掴みやすくなるのかも知れません。

以上を踏まえてコードを書いていきます。

まずは、キャラクターの名前と念の系統を入力する関数であるnenArray(配列は英語でarray)から解説します。

キャラクター名と念系統の二次元配列をこのように作成します。

//アクティブなスプレッドシートを選択するグローバル領域
const ss=SpreadsheetApp.getActiveSheet();

//スプレッドシートにキャラクターの名前と念系統の入った配列を出力する
function nenArray(){

  //二次元配列hhにキャラクターの名前と念系統を格納
  const hh = [
      ['ゴン','強化系'],
      ['キルア','変化系'],
      ['クラピカ','具現化系'],
      ['レオリオ','放出系']
    ];
  
  //配列hhをログに出力
  console.log(hh);
}

実行すると、配列がログに出力されました。

次に、上記の二次元配列は4行2列ですので、スプレッドシートのA1を起点に4行2列分のデータを確保するプログラムを書いていきます。

まず、行と列が4行2列になっていることをログ出力で確認します。
長さを調べるのにlengthを使います。

//アクティブなスプレッドシートを選択するグローバル領域
const ss=SpreadsheetApp.getActiveSheet();

//スプレッドシートにキャラクターの名前と念系統の入った配列を出力する
function nenArray(){

  //二次元配列hhにキャラクターの名前と念系統を格納
  const hh = [
      ['ゴン','強化系'],
      ['キルア','変化系'],
      ['クラピカ','具現化系'],
      ['レオリオ','放出系']
    ];
  
  //配列hhをログに出力
  console.log(hh);

  //行の長さを調べる
  console.log(hh.length);

  //列の長さを調べる
  console.log(hh[0].length);

}

行が4人分のhh.lengthが4になることはイメージしやすいと思います。

その下のhh[0].lengthですが、これは[‘ゴン’,’強化系’]の長さを調べていて、2列分なので2と返しています。


キルアのhh[1].lengthにしても同じ結果になりますが、全てのキャラクター(行)に対して2列になるので、代表してゴンのhh[0].lengthを用いております。

この行と列の長さは、スプレッドシートにキャラクターの配列hhを出力する時に、出力範囲を一致させる必要があるので調べました。

それではスプレッドシートに出力致します。
末尾にこの部分を追加します。

//二次元配列hhを格納するために、スプレッドシートの4行2列を確保して出力する
  ss.getRange(1,1,hh.length,hh[0].length).setValues(hh);

ここまでのコードの全てです。

//スプレッドシートにキャラクターの名前と念系統の入った配列を出力する
function nenArray(){

  //二次元配列hhにキャラクターの名前と念系統を格納
  const hh = [
      ['ゴン','強化系'],
      ['キルア','変化系'],
      ['クラピカ','具現化系'],
      ['レオリオ','放出系']
    ];
  
  //配列hhをログに出力
  console.log(hh);

  //行の長さを調べる
  console.log(hh.length);

  //列の長さを調べる
  console.log(hh[0].length);

  //二次元配列hhを格納するために、スプレッドシートの4行2列を確保して出力する
  ss.getRange(1,1,hh.length,hh[0].length).setValues(hh);

}

次に、データを消去に関するmyClear関数を作成します。
消去する範囲を、スプレットシート上のデータが存在する範囲として捉えることの出来るgetDataRangeを使っています。

シートオブジェクト.getDataRange()

以下、myClear関数のコードです。

//出力した配列を消去する
function myClear() {

  //出力した配列をgetDataRangeを使って取得して消去する
  ss.getDataRange().clear();

}

この書式でシート上のデータを配列として取得できました。
その下のclearメソッドで入力範囲を削除できます。

ここまでのコード全体を記述します。

//アクティブなスプレッドシートを選択するグローバル領域
const ss=SpreadsheetApp.getActiveSheet();


//スプレッドシートにキャラクターの名前と念系統の入った配列を出力する
function nenArray(){

  //二次元配列hhにキャラクターの名前と念系統を格納
  const hh = [
      ['ゴン','強化系'],
      ['キルア','変化系'],
      ['クラピカ','具現化系'],
      ['レオリオ','放出系']
    ];
  
  //配列hhをログに出力
  console.log(hh);

  //行の長さを調べる
  console.log(hh.length);

  //列の長さを調べる
  console.log(hh[0].length);

  //二次元配列hhを格納するために、スプレッドシートの4行2列を確保して出力する
  ss.getRange(1,1,hh.length,hh[0].length).setValues(hh);

}


//出力した配列を消去する
function myClear() {

  //出力した配列をgetDataRangeを使って取得して消去する
  ss.getDataRange().clear();

}

シートのボタンにそれぞれのスクリプトを割り当てて実行します。

ボタンを右クリックで選択して、右上の「・・・」から「入力」ボタンに「nenArray」、消去ボタンに「myClear」のスプリクトを割り当てます。

これで、キャラの名前と念の入った配列をボタンを押すことで手軽に実行出来る様になりました。


お疲れ様でした。ブレイクタイムPhotoは、

横浜のクルーズ船です。

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

←episode2               episode4→

←GAS自作サンプル集HUNTER×HUNTERへ戻る

HUNTER×HUNTERのGAS自作サンプル集のページに戻る
初めてのGASに戻る


自己紹介

episode2 GAS【文字入力と消去をボタンで操作】「HUNTER×HUNTERで覚えるGoogle Apps Script」

この記事のシリーズを読むことで、アニメHUNTER×HUNTER(ハンターハンター)を通してGAS(Google Apps Script)の最初の一歩が学べます。

この記事では、

・スプレッドシートにボタンを作成

・ボタンの複製を簡単に行う方法

・ボタンに文字入力や消去の処理を登録してボタンを押したら実行出来る

についての概要を掴めます。

まずは前回(episode1)の復習を軽く行います。

・セルA1に「ハンターハンター」と入力する

function hh1no1() {

  //アクティブなシートにアクセスしている
  const ss=SpreadsheetApp.getActiveSheet();

  //セルA1をgetRangeで捕まえて文字列「ハンターハンター」を入力
  ss.getRange('A1').setValue('ハンターハンター');
  
}

・セルA1の内容を実行ログに出力

function hh1no2() {

  const ss=SpreadsheetApp.getActiveSheet();

  ss.getRange('A1').setValue('ハンターハンター');

  //ここを追加してセルA1の内容をログに表示する
  console.log(ss.getRange(1,1).getValue());
  
}

・セルA1の内容を消去する

function hh1no3() {

  const ss=SpreadsheetApp.getActiveSheet();

  //セルA1を消去
  ss.getRange(1,1).clear();

}

復習は以上になります。


これらの処理(関数)に、それぞれ名前を付けます。

まず、毎回必ず関数の中に

const ss=SpreadsheetApp.getActiveSheet();

この様に書くのが面倒ですので、毎度毎度書かなくても良い様に、一番先頭の所(関数の外側)のグローバル領域に書きます。

いきなり「関数」なんて出てくると難しそうですが、

入力とログ表示」を「ゴンさんのお家」、
文字の消去」を「キルアさんのお家」、
両家(両方)で使える共通の場所として「ゴミ捨て場」を先頭に書いた

というイメージです。

ゴミ捨て場 →「共通:アクティブなシートを選択」・・・グローバル関数(共通領域)でHUNTER×HUNTERのキャラ全員が使える

【hh1no2】を修正

myInput関数・・・ゴン家→「入力:セルA1に「ハンターハンター」と入力して実行ログに表示する」

【hh1no3】を修正

myClear関数・・・キルア家→「消去:セルA1に入力された内容を消去する」

hh1no1はそのまま残して置いても大丈夫です。

ゴンさんは、ゴンさんの家と共通のゴミ捨て場は使えるけれど、キルアさんの家のものは使えない(門が固くて開けられなかった)、キルアさんの立場ではその逆が言える、これが関数のイメージです。

それではグローバル領域、入力とログ出力、消去の関数をそれぞれエディタに書いて行きます。

//アクティブなスプレッドシートを選択するグローバル(キャラ共通の処理)
const ss=SpreadsheetApp.getActiveSheet();


//入力とログ出力をする関数(ゴンさんの家)
function myInput() {
  
  //セル入力
  ss.getRange(1,1).setValue('ハンターハンター');

  //ログ出力
  console.log(ss.getRange(1,1).getValue());

}


//消去する関数(キルアさんの家)
function myClear() {

  //セルA1を消去
  ss.getRange(1,1).clear();

}

このようにスクリプトを作成しました。


次にボタンを作成して、「入力ボタン」「消去ボタン」を作ると、より操作がしやすくなります。

スプレッドシートに「入力」と「消去」というボタンを2つ作って、それぞれのボタンに関数(スクリプト)を割り当てます。

その方法について、図解で掲載致します。

まず「入力ボタン」を作ってから、それを元に「消去ボタン」を作ります。
ボタンの作り方は、「挿入」→「図形描画」から作れます。


ここでボタンの形に近い任意の図形を選択します。

この形がボタンに近いと個人的には思いました。
お好きな形で大丈夫です。

図形を選択すると文字が入力可能です。

この様にすぐに中央に入力されましたので、ここからボタンの色や文字の太さや大きさなどをお好みに整えます。

右上の「保存して閉じる」をリンクをクリックします。

この後に、この「入力ボタン」を元に「消去ボタン」をコピーして作成します。

まず、さっき作った「入力ボタン」をクリックして、の右上角の「てんてんてん」をクリックし、「編集」をクリックして、編集画面で「入力ボタン」を[Ctrl]+[C]でコピーします。

右上の「保存して閉じる」のリンクをクリックして、(面倒ですが)またスプレッドシートの「挿入」→「図形描画」から図形の編集画面を開き、[Ctrl]+[V]で貼り付けて、ボタンの文字を「消去」に変えて文字や色を整えて、右上の「保存して閉じる」のリンクをクリックして閉じるとスプレッドシートに戻って複製した「消去ボタン」が作れました。

位置を調整します。

「入力」ボタンをクリックして、右側の3点の「スクリプトを割り当て」をクリックします。

そこに、「myInput」と入力します。

確定を押します。

消去ボタンの「myClear」も同じようにスクリプトを割り当てます。

すると、ボタンを押すだけで簡単に実行して文字を入力したり消したりが出来る様になりました。


お疲れ様でした。ブレイクタイムPhotoは、

横浜みなとみらいの夜景です。

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)



←episode1               episode3→

←GAS自作サンプル集HUNTER×HUNTERへ戻る


HUNTER×HUNTERのGAS自作サンプル集のページに戻る
初めてのGASに戻る


自己紹介

episode1 GAS【セル操作で入力と消去】「HUNTER×HUNTERで覚えるGoogle Apps Script」

この記事を読むことで、

・GASを動かす準備を画像つきで解説

・今日初めてGASを使う方がセルA1に好きな文字を入れるコードを書ける

・文字の消去のコードも書ける

についての概要が掴めます。

GASは環境設定不要ですぐ始められますが、

・Googleアカウント
・「マイドライブ」などから「新規」でスプレッドシートを追加

・スプレッドシートの上記メニュー「拡張機能」→ 「Apps Script(エディタ)」

この3点の準備は必要です。
「Apps Script(エディタ)」にコードを書いて行きます。

エディタには「無題のプロジェクト」から「HHepisode1」という名前を付けて変更しました。

準備が整ったところで、まず最初に、スプレッドシートのセルA1に「ハンターハンター」と入力するスクリプトを書いてみます。

「こんにちは」や好きな言葉、他の作品で例えば「鬼滅の刃」、「SPY×FAMILY」、「呪術廻戦」などでも楽しければ何でもOKです!

getRange(‘セル番地’)でセルを指定して、setValue(‘入力する値’)で指定したセルに値を入力します。

初期状態のまっさらなスプレッドシートです。

エディターに下記のコードを書いて行きます。

function hh1no1() {

  //アクティブなシートにアクセスしている
  const ss=SpreadsheetApp.getActiveSheet();

  //セルA1をgetRangeで捕まえて文字列「ハンターハンター」を入力
  ss.getRange('A1').setValue('ハンターハンター');
  
}

こんな感じに書けました。
エディターは[Ctrl]+[S]で保存します。

Macの方は、「Command」と読み替えて下さい。

[Ctrl]+[R]で実行しようとすると・・・。

「承認が必要です」とメッセージが出るので、「権限を確認」で、

自分のアカウントを選ぶと、

この様なアラート画面が出ます。

なぬ!!

でも大丈夫。

「詳細」をクリックして。

「安全ではないページ」に移動して、

パソコンが爆発とか無いので、大丈夫です(=^x^=)

少し下にスクロールして「続行」を押します。

実行ログです。

されたことが分かり、スプレッドシートを見てみると、

この様に無事に入力されていました。

次に、セルA1に入力された「ハンターハンター」の文字を、実行ログに出力してみます。

//ここを追加してセルA1の内容を表示する
console.log(ss.getRange(1,1).getValue());

を追加します。

function hh1no2() {

  const ss=SpreadsheetApp.getActiveSheet();

  ss.getRange('A1').setValue('ハンターハンター');

  //ここを追加してセルA1の内容をログに表示する
  console.log(ss.getRange(1,1).getValue());
  
}

最後に、このセルA1の文字を消します。

setValue(‘入力する値’)のところを、clear()と書き換えます。

//セルA1を消去
ss.getRange(1,1).clear();

function hh1no3() {

  const ss=SpreadsheetApp.getActiveSheet();

  //セルA1を消去
  ss.getRange(1,1).clear();

}

実行すると・・・

無事に消去できました。

今回は、セルをA1を(1,1)と記述しましたが、(‘A1’)と書いても同様に処理できます。
また、セルB1は(1,2)で、セルA2は(2,1)です。
後に範囲を取得する場合に備えて今回は(1,1)と記述しました。


お疲れ様でした。ブレイクタイムPhotoは、

横浜ランドマークタワーのジンジャエールです。
美味しかったです。

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

← HUNTER×HUNTERのGAS自作サンプル集のページに戻る     

episode2へGO→

HUNTER×HUNTERのGAS自作サンプル集のページに戻る
初めてのGASに戻る


自己紹介

GASで「ねこあつめ」を「Chatwork」に送る(=^x^=)mm「ねこあつめシリーズ:その11」

この記事では、GAS(Google Apps Script)で今までスプレッドシートに作ってきた「ねこあつめ」の情報を実際にChatworkに送信する流れを掲載しております。
お世話になった記事は、【初心者向けGAS】Google Apps Scriptで別の関数を呼び出すfunctionの書き方
です。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

前回の復習をいたします。

GASでChatworkにメッセージを送信するコードと、実際に送信されたメッセージです。

function testMessage(){
  const cw=ChatWorkClient.factory({token:'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'});
  const body='テストメッセージにゃん(=^x^=)mm。。。!';
  cw.sendMessageToMyChat(body);  
}

今回の内容に入る前に、ねこあつめ画像で癒されます(=^x^=)

↑「サビガー(左)」と「ヘキサにゃん(右)」

今回は、今まで作ってきたねこあつめのスプレッドシートを使って、ねこちゃんの名前(A列)をChatworkに送るコードを掲載します。

今まで作ってきた、ねこあつめのコードです。

function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得

  for (let i = 2; i <= lastRow; i++) {

    //もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
    if (!ss.getRange(i, 4).getValue()) {
      console.log(ss.getRange(i, 1).getValue());
      ss.getRange(i, 4).setValue('済');

      //もしも最終行以上になったらセル範囲を消去する
      if (i >= lastRow) {
        ss.getRange(2, 4, lastRow - 1).clearContent();
      }
      break;
    }
  }
}

この9行目をご覧下さい。

console.log(ss.getRange(i, 1).getValue());

ここを変更して、Chatworkにメッセージを送れるように変更します。
今回作るプログラムの流れは、

「ねこあつめのメッセージを取得するプログラム(メイン)」から、「Chatworkに送信する関数」に「【送れ】と指示出しする」

という流れになります。

「ねこあつめ」のメッセージを「body」という変数に格納し、Chatworkに送信する関数「sendMessage」に「body」を送り込むイメージです。

メインから関数sendMessageに対して「body」を引数にして、「sendMessage(body)」として呼び出して、「これを送ってくれ」というメッセージを送り込みます。

関数のイメージはなかなか掴みいにくいので、以下のように置き換えてみました。

例えば、私がアマゾンで、DVD(上記のbodyをDVDに置き換えると、トレース(追跡)しやすくなるかもっ!)を買ったとします。

プログラム実行開始・・・私がアマゾンに「DVDをくれ!」とポチる

メイン関数が呼ばれる・・・アマゾンが注文を受ける

チャットワークに送信する関数が呼ばれる・・・アマゾンから宅配業者へとDVDが渡る

チャットワークに「ねこあつめ」が出力される・・・宅配業者から、DVDが私の手元に届く

ざっくりですが、これがプログラムをトレースして行った時の流れです。
以上を踏まえてプログラムを下記のように修正しました。
コメントを参考に、頭の中でトレースしてイメージを掴みました。

トークンIDの実際のものは’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’の所に入れます。

//メインの関数でAmazonにDVDの注文をする
function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得

  for (let i = 2; i <= lastRow; i++) {

    //もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
    if (!ss.getRange(i, 4).getValue()) {

      //AmazonがDVDの注文を受け取る
      const body=ss.getRange(i, 1).getValue();

      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(body);
      ss.getRange(i, 4).setValue('済');

      //もしも最終行以上になったらセル範囲を消去する
      if (i >= lastRow) {
        ss.getRange(2, 4, lastRow - 1).clearContent();
      }
      break;
    }
  }
}

//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(body){
  const cw=ChatWorkClient.factory({token:'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'});
  cw.sendMessageToMyChat(body);
}

では早速、「ねこあつめ」の名前をChatworkに送ってみます。

実行すると、Chatworkにメッセージ「ヘキサにゃん」が送られました。

スプレッドシートは「ヘキサにゃん」のところに、処理済みの「済」が入っています。

他の猫ちゃんたちも同様にChatworkに送ってみます。

三匹目までの猫ちゃんを送ると、このようになり、最後のとらきちまで送ると、

クリアになって、再び最初の「ヘキサにゃん」から送れます。
これでは、「Chatwork」ではなく、「Catwork」ですね(=^x^=)mm

ご精読ありがとうございました。

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

←前に戻るにゃん             次行くにゃん→

<ねこフォーム6>ねこあつめフォームに「チェックボックス」を追加する

この記事では、GAS(Google Apps Script)を使って、ねこあつめフォームに「チェックボックス」を追加します。
お世話になった記事は、いつも隣にITのお仕事さんの、

GASでGoogleフォームにチェックボックス形式の質問を追加する方法

です。

まず、前回の復習をします。
このようなフォームを作って、ラジオボタンを追加しました。

前回のコードです。

function myFunction() {

  //SpreadsheetAppから現在のスプレッドシートにアクセス
  const ss=SpreadsheetApp.getActiveSpreadsheet();

  //シート名「イベント概要」のデータを配列として取得する
  const values=ss.getSheetByName('イベント概要').getDataRange().getValues();
  const formTitle=values[0][1];//タイトル
  const formDescription=values[1][1];//概要
  
  //フォームを作成
  const form=FormApp.create(formTitle);

  //ここでプロパティストアに格納したFOLDER_IDを使って、指定のフォルダにフォームを作成する
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//idにFOLDER_IDを格納する
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームのIDをformFileに格納する
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにフォームを格納する
  DriveApp.getRootFolder().removeFile(formFile);//マイドライブに作成されたフォームを削除する

  //フォームの説明を作成
  form.setDescription(formDescription);

  //テキストアイテムを追加する
  form.addTextItem().setTitle('おなまえ').setRequired(true);//trueにすることで、入力必須にしている。
  form.addTextItem().setTitle('あそんだグッズ');

  //メールアドレスのテキストアイテムを加える
  const validationEmail=FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('めあど').setRequired(true).setValidation(validationEmail);

  //←ラジオボタンを加える
  form.addMultipleChoiceItem()
    .setTitle('種類は何系?')
    .setChoiceValues(['みけ','とら'])
    .setRequired(true);

}

今回の内容に入る前に、ねこあつめ画像で癒されます(=^x^=)

前回のラジオボタンで作った選択肢は、「みけ」か「とら」かだけでしたが、上の画像の「ねこまたさん」など、「みけ」でも「とら」でもないコもいるので、「その他」のチェックボックスも作ってみます。

こちらのコードを追加します。

//←チェックボックスを追加する
  form.addCheckboxItem()
    .setTitle('種類は何系?(チェックボックス)')
    .setChoiceValues(['みけ','とら']) 
    .showOtherOption(true)//その他のチェックボックスを作っている
    .setRequired(true); 

実行してプレビューで確認した画面です。

ここまでのコードをまとめます。

function myFunction() {

  //SpreadsheetAppから現在のスプレッドシートにアクセス
  const ss=SpreadsheetApp.getActiveSpreadsheet();

  //シート名「イベント概要」のデータを配列として取得する
  const values=ss.getSheetByName('イベント概要').getDataRange().getValues();
  const formTitle=values[0][1];//タイトル
  const formDescription=values[1][1];//概要
  
  //フォームを作成
  const form=FormApp.create(formTitle);

  //ここでプロパティストアに格納したFOLDER_IDを使って、指定のフォルダにフォームを作成する
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//idにFOLDER_IDを格納する
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームのIDをformFileに格納する
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにフォームを格納する
  DriveApp.getRootFolder().removeFile(formFile);//マイドライブに作成されたフォームを削除する

  //フォームの説明を作成
  form.setDescription(formDescription);

  //テキストアイテムを追加する
  form.addTextItem().setTitle('おなまえ').setRequired(true);//trueにすることで、入力必須にしている。
  form.addTextItem().setTitle('あそんだグッズ');

  //メールアドレスのテキストアイテムを加える
  const validationEmail=FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('めあど').setRequired(true).setValidation(validationEmail);

  //ラジオボタンを加える
  form.addMultipleChoiceItem()
    .setTitle('種類は何系?(ラジオボタン)')
    .setChoiceValues(['みけ','とら'])
    .setRequired(true);

  //←チェックボックスを追加する
  form.addCheckboxItem()
    .setTitle('種類は何系?(チェックボックス)')
    .setChoiceValues(['みけ','とら']) 
    .showOtherOption(true)//その他のチェックボックスを作っている
    .setRequired(true); 

}

ご精読ありがとうございました。

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

←前に戻るにゃっ!          次行くにゃん(=^x^=)→

<ねこフォーム5>ねこあつめフォームに「ラジオボタン」を追加する

この記事では、GAS(Google Apps Script)を使って、ねこあつめフォームに「ラジオボタン」を追加します。お世話になった記事は、いつも隣にITのお仕事さんの、

GASでGoogleフォームにラジオボタンの質問を追加する方法

です。

まずは前回の復習をします。
メールアドレスが正しいかどうか検証するコードを書きました。

このようなフォームの原型を作成し、1番下に「めあど」のテキストアイテムが入力必須で追加されました。

プレビュー画面にすると、

このようになり、最後の「めあど」の所に架空のアドレスを入力します。

このメアドから「@」を削除して送信を押すと、

この様に、有効なアドレスではないと検証されました。

前回のコードです。

function myFunction() {

  //SpreadsheetAppから現在のスプレッドシートにアクセス
  const ss=SpreadsheetApp.getActiveSpreadsheet();

  //シート名「イベント概要」のデータを配列として取得する
  const values=ss.getSheetByName('イベント概要').getDataRange().getValues();
  const formTitle=values[0][1];//タイトル
  const formDescription=values[1][1];//概要
  
  //フォームを作成
  const form=FormApp.create(formTitle);

  //ここでプロパティストアに格納したFOLDER_IDを使って、指定のフォルダにフォームを作成する
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//idにFOLDER_IDを格納する
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームのIDをformFileに格納する
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにフォームを格納する
  DriveApp.getRootFolder().removeFile(formFile);//マイドライブに作成されたフォームを削除する

  //フォームの説明を作成
  form.setDescription(formDescription);

  //テキストアイテムを追加する
  form.addTextItem().setTitle('おなまえ').setRequired(true);//trueにすることで、入力必須にしている。
  form.addTextItem().setTitle('あそんだグッズ');

  //←メールアドレスのテキストアイテムを加える
  const validationEmail=FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('めあど').setRequired(true).setValidation(validationEmail);

}

今回の内容に入る前にねこあつめ画像で癒されます。

今回は「ラジオボタン」を作って行きます。
ラジオボタンは「MultipleChoiceItem」で、タイトルと選択項目や必須かどうかを下記のコードで加えます。

//←ラジオボタンを加える
  form.addMultipleChoiceItem()
    .setTitle('種類は何系?')
    .setChoiceValues(['みけ','とら'])
    .setRequired(true);

ラジオボタンの設定には、タイトルと選択項目が必要です。
コードを見た所、選択項目は配列(リスト)になっています。
この記述でのラジオボタンは、配列(リスト)になっている所の「みけ」か「とら」かの2択を選択出来るようなっています。

実行してプレビュー画面を開きました。

ここまでのコードです。

function myFunction() {

  //SpreadsheetAppから現在のスプレッドシートにアクセス
  const ss=SpreadsheetApp.getActiveSpreadsheet();

  //シート名「イベント概要」のデータを配列として取得する
  const values=ss.getSheetByName('イベント概要').getDataRange().getValues();
  const formTitle=values[0][1];//タイトル
  const formDescription=values[1][1];//概要
  
  //フォームを作成
  const form=FormApp.create(formTitle);

  //ここでプロパティストアに格納したFOLDER_IDを使って、指定のフォルダにフォームを作成する
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//idにFOLDER_IDを格納する
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームのIDをformFileに格納する
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにフォームを格納する
  DriveApp.getRootFolder().removeFile(formFile);//マイドライブに作成されたフォームを削除する

  //フォームの説明を作成
  form.setDescription(formDescription);

  //テキストアイテムを追加する
  form.addTextItem().setTitle('おなまえ').setRequired(true);//trueにすることで、入力必須にしている。
  form.addTextItem().setTitle('あそんだグッズ');

  //メールアドレスのテキストアイテムを加える
  const validationEmail=FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('めあど').setRequired(true).setValidation(validationEmail);

  //←ラジオボタンを加える
  form.addMultipleChoiceItem()
    .setTitle('種類は何系?')
    .setChoiceValues(['みけ','とら'])
    .setRequired(true);

}

ご精読ありがとうございました。

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

←前に戻るにゃっ!          次行くにゃん(=^x^=)→

モバイルバージョンを終了