【GAS】非エンジニア40代が業務効率化のためにかゆいところに手が届くGASをお伝えするよ！

はいこんにちは。

昨日書いた記事を読んでいただいた皆様ありがとうございました。
40年以上生きてきてあれこれと書いたあれこれのカウントを半日で更新してしまい困惑の極みにおる著者です。
一体何が起きているんです・・・？

この機を逃さず、限界過疎地でGASをぐりぐりいじって業務効率化草の根活動をがんばる初心者が初心者にレクチャーしたいと思います。

最終的には、「初めてGAS触る！」という以下の感じのことができるようにコツコツ連載していきたいと思います。

:::note
googleのスプレッドシートを使ってlooker studioみたいなダッシュボードっぽい
ものを作りたい、それも（ほぼ）自動更新で！
:::

looker　studio使えよ！って思った方、あれはね、とっても素敵で便利でオシャレなんですが、
謎エラーでよく動かなくなるんですよ・・・。

**この記事を読んで欲しい方**
パワーピボット、パワークエリみたいにワンクリックで任意のフォルダの中のcsvを繋げて集計したりレポートを自動更新したい。
横型csvデータを縦型データにトランスフォームしたい。
気象庁の過去の気象データを使ってスプレッドシートであれこれしたい。
プログラミングを始めてみたいけど何からしたらいいかわからない！！！！

**この記事シリーズを読むと出来るようになること。**
スプレッドシートをGASで動かす基本を知ることができる。

**今日の記事でお伝えすること**
任意のフォルダに収めた、同じ構成（行列形式）のcsvファイルを縦に連結できるようになります。

では行ってみましょう。

**最初にすること**


* Googleアカウントを取得する。
* Googleドライブのマイドライブの中に、csvファイルとスプレッドシートを保存するフォルダを1個作る。
* このフォルダの中に、スプレッドシートを作る。
* このフォルダの中に、csvファイルを複数保存する。行列の構成が同じものにすること。
※今回は気象庁の過去の気象データを使用。

https://www.data.jma.go.jp/gmd/risk/obsdl/index.php

:::note info
練習用に、複数同一地点の異なる期間のデータを複数用意すると良いと思います。
著者は福岡、広島、福山の3か所を2つの期間に区切って"平均気温"や"湿度"など複数のデータを取得しています。
:::

* スプレッドシートのシートを2枚用意する、1つは"データレコード"、もう一つは"変数"という名前にする。
* csvファイルの文字コードを"変数シート"のB2セルに入力する。
* csvファイルを保存するフォルダのIDを"変数シート"のB1セルに入力する。
* GoogleドライブのフォルダIDは、以下の*********************************の部分です。

:::note info
https://drive.google.com/drive/folders/*********************************
:::

Googleドライブの中のファイルやフォルダは、このIDでそのフォルダ・ファイルを認識しています。なので同じ名前でも同じ場所に存在できますし、保存場所が変わってもリンク切れを起こしません、便利！！

:::note alert 
※ただし同一ファイル名が大量に作れてしまうので運用をミスるとそれはそれで面倒くさいことになる。
:::

さて、ここまでで下準備は完了です。
ちなみに、スプレッドシートのファイル名や、csvファイルを保存したフォルダ名は何でもいいです。

**GASを書いていきます。**

関数名は、超絶分かりやすくgattaiCsv。
レッツリーダブルコード。

```Javascript

function gattaiCsv() {

  //ssっていう変数にこのスプレッドシートを代入して使うって宣言するよ。
  //ssはスプレッドシートの略ですよ、pandas as pdみたいなおまじないですよ。
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  //変数を入力するシートをGASに教えてあげて、値を取得する範囲を宣言して値をまとめてとってくるよ。
  const shMaster = ss.getSheetByName("変数");
  const master = shMaster.getDataRange().getValues();

  //csvファイルをまとめて保存しているフォルダのIDと文字コードを確認しよう。
  Logger.log(master);
  //フォルダのIDと文字コードが二次元配列の形で取得できるぞ。

  //csvファイルをまとめて保存しているフォルダのIDを取得しよう。
  const folderId = master[0][1];
  Logger.log(folderId);
   //これは、変数表の0行目、1列目が何か見せてね、という命令ですよ。

  //取り込むcsvファイルの文字コードを取得しよう。
  const mojicpode = master[1][1];
  Logger.log(mojicpode);
  //これは、変数表の1行目、1列目が何か見せてね、という命令ですよ。

  //csvファイルをまとめて保存しているフォルダをGASに知らせてあげる。
  //フォルダ内のファイル情報をまとめてガサっと取得する・
  //その中から、csvファイルだけを抽出する。
  const folder = DriveApp.getFolderById(folderId);
  //ファイル形式がcsvのものを指定してfilesというかたまりにして取得する。
  const files = folder.getFilesByType(MimeType.CSV);
   //MimeType.CSVが、csvファイルを指定していますよ。

  //ファイル情報を順次入れてゆく空っぽの配列を用意する。
　　//これはまぁおまじないみたいなもんです。
  const tempArray = [];

  while(files.hasNext()){
    const file = files.next();
    const csvRecord = Utilities.parseCsv(file.getBlob().getDataAsString(mojicpode));
    tempArray.push(csvRecord);
    
  }
//whileとかBlobとか意味わからんと思うけど、ほぼ古典のようよううすうなりゆく・・・みたいにどこ見ても大抵この書き方だから最初は悩まずコピペ、そのあとfileとfilesの違いにモヤモヤしたりしてください。私はかなりモヤりました。なんでこんな間違えやすい変数にするんや・・。

  const csvRecords = tempArray.flat();
  Logger.log(csvRecords);

  //合体したレコードの行の長さを取得
  const rowLength = csvRecords.length;
  //合体したレコードの列の長さを取得
  const colLength = csvRecords[0].length;

  Logger.log([rowLength,colLength])

  //ヘッダ情報を確認してみる。
  Logger.log(colLength[0]);

  //良くわかんないからとりあえずスプレッドシートに配置してみる。
  ss.getSheetByName("テーブルデータ").getRange(1,1,rowLength,colLength).setValues(csvRecords);
  
}


```
とりあえず今日はここまで。

こいつを書いて保存、Ctrl+Rで実行しましょう。
自分のGoogleドライブへのアクセス許可を求めるポップアップが出ると思うんで許可してください。
その後もう一度Ctrl+Rで実行しましょう。

:::note warn
※この儀式は、ファイルを新規作成して初めてGASを動かすときに毎回発生します。
2回目以降は出ません。
:::

スプレッドシートの"テーブルデータ"シートに各地の気象データが入力されていると思います。
次回以降、クレンジングと縦型データへの変換を紹介します。

多分プロの皆さんから見ればきっちゃないコードと思われると思いますが、とりあえず初心者が初心者に「こんなんできるよ！見てみて！！！」が趣旨の記事なので勘弁してくださいませ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/70598135-453c-7e5b-7fbf-1f71da8cdd6d.png)