ASTERIA GoogleSheetsアダプター

# ASTERIAでSpreadSheetアダプタ使ってみました
その感想でも書きます.
あくまで2018/09/21時点の情報です.
## まず公式をよもう
ASTERIA
[CDataオプション紹介 〜 GoogleSheets編①
](https://support.asteria.com/hc/ja/articles/235577248-CData%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E7%B4%B9%E4%BB%8B-GoogleSheets%E7%B7%A8-)[CDataオプション紹介 〜 GoogleSheets編②](https://support.asteria.com/hc/ja/articles/235692067-CData%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E7%B4%B9%E4%BB%8B-GoogleSheets%E7%B7%A8-)
[CDataオプション紹介 〜 GoogleSheets編③](https://support.asteria.com/hc/ja/articles/235794767-CData%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E7%B4%B9%E4%BB%8B-GoogleSheets%E7%B7%A8-)
[CDataオプション紹介 〜 GoogleSheets編④](https://support.asteria.com/hc/ja/articles/235871048-CData%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E7%B4%B9%E4%BB%8B-GoogleSheets%E7%B7%A8-)

CData
[はじめに](http://cdn.cdata.com/help/GLB/jdbc/pg_startedintroj.htm)
日本語だからわかりやすい!

# IDで指定する方法
![cdata_201826_1.png](https://qiita-image-store.s3.amazonaws.com/0/180419/4525b5ad-0528-953c-1bba-ac4b06200e77.png)

```
基本>スプレッドシート
https://spreadsheets.google.com/feeds/spreadsheets/{ID}
{ID}にはspreadsheetのIDを代入
```
@scha さんに教えて頂きました.ありがとうございます.



## ダミーデータ
![qiita_20180921_1.png](https://qiita-image-store.s3.amazonaws.com/0/180419/665990e9-2f6e-01ef-9695-64df904c030a.png)




# GoogleSheetsGetコンポーネント
## 共通なところ
- 取得する値はSpreadSheetの表示上の値(=GASのgetDisplayValues()).(←ここは書式が掛かっていない値(=GASのgetValues())が本当は欲しいね.)
    - 数式→数式を計算後の結果(ここはこれでいい)
    - カンマ区切りなどの表記→そのままで戻ってくる

## Header:はい の場合
![qiita_20180921_2.png](https://qiita-image-store.s3.amazonaws.com/0/180419/458f1f29-2962-cde7-a0d0-98a486af36c9.png)

- 1行目がヘッダーになる.
- 最初のコネクション時に, カラム名やカラム数やデータ型が決定する.
    - 人間が直すことは*できない*.
    - 変更したいときはコネクション接続からやり直す.
- カラム名について
    - 数字(=B列)や空白(=C列)のときは取得できない.(謎のカラムになる)
    - 英語(=G列)のときは頭文字が大文字でそれ以降小文字になる.(fieldG→Fieldg)
    - 日本語(=D列)のとき, ちゃんと取得できている.
- データ型について
    - 自動変換(厳密にどこで判定しているか不明)
    - 文字列→varchar
    - 数値→Double
    - 日付→Date とちゃんと自動で取得される.
    - ある行は数字,ある行は文字と型が混ざるとき(=B6セル)
        - B列はDouble型になる.
        - ↪取得のとき, 型が異なるとエラーになる!!
- 空白行について
    - 空白行の手前まで取得する.(7~8行目は取得しない)

## Header:いいえのとき
![qiita_20180921_3.png](https://qiita-image-store.s3.amazonaws.com/0/180419/9afa306d-f0d5-f8cd-9872-bbae712d3634.png)

- 当然, 1行目もデータと認識
- カラムについて
    - フィールド名はスプシのセルの列番号と同じ
    - 謎のカラム群(TABLE_CATなど)が登場. (しかも何者か不明)
    - IDは*行番号*(←ここはちゃんとIDで返してほしいですね)
- データ型について
    - 自動変換(厳密にどこで判定しているか不明)
    - 日付がDate型と認識しない! 
    - 数値はちゃんとDoubleと認識するよ
- 空白行について
    -  _空白行があっても_ 最後の行まで値を取得(7~8行目も取得)


# GoogleSheetsSQLCallコンポーネントで取得するとき
![qiita_20180921_4.png](https://qiita-image-store.s3.amazonaws.com/0/180419/804ca0ee-a138-9cec-5445-7ffecab4a10a.png)
Headerは"いいえ"のみ.

- 1列目は行番号
-データ型について
    -自分で(ある程度)設定できる.
    - 数値(=B列) Doubleでもvarcharでもどちらでも設定できる.
    - 日付(=D列)をDateTime型に設定すると型が違うと怒られる.→varcharにせざるを得ない.

- 取得範囲について
    - #A:Gのような*列全部*を範囲指定は出来ない
    - #A1:G8のように必ず数字を入れる必要がある
    -　最終行が可変のときは使いづらい


# 結論
## ダメな点
SpreadSheetはノンプログラマーが使うため型が緩さがメリットなのに,
AsteriaはJavaなので静的な言語なため型に厳しすぎる.
API経由なので,全部文字列でいいとおもう. Linuxとかそうだし.

## 良い点①
ASTERIAからGASへデータを渡すのはASTERIAのデフォルトの機能だけでできるのだが,
SpreadSheetからASTERIAへのデータの受渡しはjarなどをいれて,
さらにJavaを書かないとできなかった.
これがコンポーネントだけでできるようになるのは大きい!

## 良い点②
pythonでSheet APIを使って, SpreadSheetの値を取得したことがあるのですが,
最終列がnullだとそのnullの分だけ配列の個数が減る!!!!(ちなみGASのgetValues()は必ず2次元配列が戻ってくる)
配列の個数がずれることによるバグが発生してしんどかったが,
Asteriaはnullを補ってくれるのでか安全性が増す.

## 私からの提案

 SpreadSheetはどんな値が入力されるかが不明な以上, 
すべてString型で取得する他ない.→SQLCallを使う.

GoogleSheetsSQLCallは取得範囲が固定問題
→2回,SQLCallしたらええやん!(当然, 遅くなるけど)

以下,　私的ベストプラクティス
![qiita_20180921_5.png](https://qiita-image-store.s3.amazonaws.com/0/180419/2dc61947-ed57-4d6a-4069-904b1248f4f2.png)

本当は
DynamicConectionコンポーネントで動的にSpreadSheetを切り替えができるようにしたい.
GoogleSheetsSQLCallコンポーネントの取得されるカラム数分ストリームがデフォルトで設定されほしい.
これらがあるとサブフロー化ができますね


# GoogleSheetsPutコンポーネントについて
行のIDでUpdateしたり, Deleteを行うようだ.
つまり, IDが行番号で取得されているコンポーネントとの併用はしんどいものがある.

GASでスクリプト書くとき
値をどこに配置するかを調べるところが一番大変.
これがIDで指定で代替できるようになればかなりインパクトは大きいと思う.