【地区別④】GASの活用 応用的プログラム

2021/05/10

GAS R03地区別セミナー

今回はその続きの応用的プログラム(配列・乱数・関数・Web API)について検討します。

はじめに

使用する教材

高等学校情報科「情報Ⅰ」教員研修用教材 第3章 JavaScript版』を参考にします。

教材はこちらの文科省のページからダウンロードできます。

今回の記事では、JavaScript版の P28-31 の内容を扱います。

プロジェクトの準備

実習用のプロジェクトを作成しましょう。

スプレッドシートのコンテナバインドスクリプトを作成します。

スプレッドシート名、プロジェクト名は任意です。「応用的プログラム」などでよいでしょう。

配列

配列を用いたプログラムの例

研修用教材JavaScript版 P28-29

図表2、図表3のコードをGASで記述します。

図表2のコード
function zuhyo2() {
  const a = [56, 3, 62, 17, 87, 22, 36, 83, 21, 12];
  const sum = a[3] + a[7];
  console.log(sum);
}
// ---結果---
// 100
図表3のコード
function zuhyo3() {
  const a = [56, 3, 62, 17, 87, 22, 36, 83, 21, 12];
  let sum = 0;
  for (let i = 0; i < a.length; i++) {
    sum = sum + a[i];
  }
  console.log(sum);
}
// ---結果---
// 399

演習1

<演習1> 図表3のコードを参考にして「整列 a の中の最小値を表示する」プログラムを作成しましょう。

クリックして表示
演習1のコード
function enshu1() {
  const a = [56, 3, 62, 17, 87, 22, 36, 83, 21, 12];
  let min = a[0];
  for (let i = 1; i < a.length; i++) {
    if (a[i] < min) {
      min = a[i];
    }
  }
  console.log(min);
}

乱数

乱数を用いたプログラムの例

研修用教材JavaScript版 P29

図表4、図表5のコードをGASで記述します。

図表4のコード
function zuhyo4() {
  const a = 5;
  const r = parseInt(10 * Math.random());
  if (a === r) {
    console.log('当たり');
  }
  else if (a > r) {
    console.log('aの方が大きい');
  }
  else if (a < r) {
    console.log('aの方が小さい');
  }
}
図表5のコード
function zuhyo5() {
  const r = parseInt(10 * Math.random() + 1);
  console.log(r);  
}

演習2

<演習2> 上の図表 5 のコードにおいて「a と r の値を表示」するようにプログラムに追加を行い,「当たり」と表 示されているときには確かに a=r であることを確認しましょう。

”図表 5”は、図表4の間違いでしょう。

クリックして表示
演習2のコード
function enshu2() {
  const a = 5;
  const r = parseInt(10 * Math.random());
  console.log('a : ' + a + ', r : ' + r);
  if (a === r) {
    console.log('当たり');
  }
  else if (a > r) {
    console.log('aの方が大きい');
  }
  else if (a < r) {
    console.log('aの方が小さい');
  }
}

関数

関数で分割したプログラムの例

研修用教材JavaScript版 P30

図表9のコードをGASで記述します。実行する関数をzuhyo9に指定して実行します。

図表9のコード
function listsum(a) {
  let sum = 0;
  for (let i = 0; i < a.length; i++) {
    sum = sum + a[i];
  }
  return sum;
}

function zuhyo9() {
  const a =  [56, 3, 62, 17, 87, 22, 36, 83, 21, 12];
  const sum = listsum(a);
  console.log(sum);
}

演習3

<演習3>  上の図表 9 のコードを参考にして「指定した回数 p 回 2 を加算するプログラム」を作成し,関数に分割 してください。なお引数は「繰り返す回数 p 」,戻り値は「加算した結果」としてください。

クリックして表示
演習3のコード
function add2(num) {
  let sum = 0;
  for (let i = 0; i < num; i++) {
    sum = sum + 2;
  }
  return sum;
}

function enshu3() {
  const sum = add2(10);
  console.log(sum);
}

Web APIの利用

Web API を利用したプログラムの例

研修用教材JavaScript版 P31

Web APIを用いたプログラムの体験として、zipcloudというサービスが提供する郵便番号検索APIを利用します。

このサービスでは、URLに調べたい郵便番号を含めたリクエストを送ることで、住所などの情報をJSON形式で返してくれます。

試しに、〒540-0002(大阪城の郵便番号)の情報を受け取りましょう。こちらのページの説明によると、下のようなURLを生成しリクエストを送ればよさそうだとわかります(ハイフン付きでもOKとのこと)。

https://zipcloud.ibsnet.co.jp/api/search?zipcode=5400002

スクリプトに組み込む前に、一度試します。任意の場所でコマンドプロンプトを起動し、curl.exeコマンドの引数に上のURLを与えて実行します。(もしくは、ブラウザのアドレス蘭に上のURLを入力して叩いても構いません。)

curl.exe https://zipcloud.ibsnet.co.jp/api/search?zipcode=5400002

以下のような内容が返ってきたのが確認できます。

{
        "message": null,
        "results": [
                {
                        "address1": "大阪府",
                        "address2": "大阪市中央区",
                        "address3": "大阪城",
                        "kana1": "オオサカフ",
                        "kana2": "オオサカシチュウオウク",
                        "kana3": "オオサカジョウ",
                        "prefcode": "27",
                        "zipcode": "5400002"
                }
        ],
        "status": 200
}

resultsの値となる配列の中で、address1の値が大阪府address2の値が大阪市中央区であることが読み取れます。郵便番号の数字を変えると当然取得する値も変わります。色々変えて試してみてください。

では、GASのスクリプトの中に郵便番号を調べるリクエストを組み込み、返ってきた値を表示させてみましょう。

GASでWeb APIを利用するには、UrlFetchAppクラスfetchメソッドを利用すればいいようです。こちらこちらの内容を参考に、取得したレスポンスの中身を表示します。

Web APIの利用1
function apiTest_1() {
  const url = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=5400002';
  const response = UrlFetchApp.fetch(url);
  console.log(response.getContentText());
}
// --- 結果 ---
// {
// 	"message": null,
// 	"results": [
// 		{
// 			"address1": "大阪府",
// 			"address2": "大阪市中央区",
// 			"address3": "大阪城",
// 			"kana1": "オオサカフ",
// 			"kana2": "オオサカシチュウオウク",
// 			"kana3": "オオサカジョウ",
// 			"prefcode": "27",
// 			"zipcode": "5400002"
// 		}
// 	],
// 	"status": 200
// }

無事に取得できました。さらに、住所の情報をもっとピンポイントに取得するために書き換えます。

取得したデータをJSON.parseでオブジェクトに変換し、必要な要素だけを取り出していきます。

Web APIの利用2
function apiTest_2() {
  const url = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=5400002';
  const response = UrlFetchApp.fetch(url);
  const searchResult = JSON.parse(response.getContentText());
  console.log(searchResult.results[0].address1);
  console.log(searchResult.results[0].address2);
  console.log(searchResult.results[0].address3);
}
// --- 結果 ---
// 大阪府
// 大阪市中央区
// 大阪城

欲しいデータをピンポイントで取り出すことができました。

おわりに

今回は、配列・乱数・関数・Web APIをご紹介しました。

次回は、Web APIを応用したスクリプトについて検討します。

QooQ