グーグル・スプレッドシートでマクロを書こうぜ

関連記事：http://qiita.com/muzudho1/items/deea9da28b0f5b0c3695

グーグルのスプレッド・シートでマクロが書けるらしい。

そういえば前に Libre Office Calc でマクロを組んだのだった。
http://qiita.com/muzudho1/items/dcd876a26a223045535c

今度はできるだろうか？　調べてみよう。

「[Tool] Google SpreadSheetでマクロを使って作業を効率化」YoheiM.NET
http://www.yoheim.net/blog.php?q=20130412

# 目標

表のデータを　JSON形式に変換して　何かで表示して確認する。

|A列|B列|C列|
|---|---|---|
|名前|年齢(歳)|体重(kg)|
|一郎|13|50|
|二郎|12|48|
|三郎|11|47|

テストデータはこんなものでいいだろう。１行目はヘッダーなので　読み飛ばしたい。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170407a1.png?raw=true)

[ツール] - [スクリプト エディタ...] と進んでみる。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170407a2b1.png?raw=true)

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170407a3.png?raw=true)

自信がないぞ。
さっき掲載したＵＲＬから　ソースコードを貼り付けよう。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170407a4.png?raw=true)

Ctrl + S キーで保存できるだろうか？

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170407a5b1.png?raw=true)

実行なんか　できないよなあ。関数定義を書いただけだし。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170407a6b1.png?raw=true)

次、何したらいいのかわからん。作業の流れを分かってない。勘で進む。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170407a7.png?raw=true)

ストアに置くとか、そんなことがしたいのではなかった。
練習用のスプレッドシートから　練習で作ったマクロを呼び出すとか　どうやるのか？

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170407a8.png?raw=true)

と思ったら　後ろに隠れたウィンドウで　ダイアログボックスが出ていた。
なんだ　この　しっちゃかめっちゃか　な配列の要素の並びは……。

２行目を　ヘッダー　だと思ってるのか。
サンプル・プログラムの中身も読まないとダメか。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170407a9b1.png?raw=true)

おっ、ここをいじれば　いいのでは……（＾ｑ＾）

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170407a10.png?raw=true)

やったぜ！

# 追記

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170407a11b1.png?raw=true)

編集が終わったら JSON を　ウェブ・アプリケーション・サーバーにフォーム送信しようかと思ったんだが、こんなんを選んでおけばいいのだろうか？

ボタンは　どこにあるんだ？
「編集時」と「値の変更」の違いもわからん。

「Google Spreadsheetのトリガーの「編集時」と「値の変更」の違いを検証してみた」まだ中学生のブログ
http://madachugakusei.hatenablog.com/entry/2015/10/18/140439

編集が終わったかどうかのイベントは無いようなので、「編集時」を使って　編集が終わったかどうかは自分のプログラムで判断しろ、とのことらしい。

「【幹事必見！】スプレッドシートの入力が完了したらチャットワークに自動で通知する方法」いつも隣にITのお仕事
http://tonari-it.com/gas-spreadsheet-chatwork/


![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170407a12b1.png?raw=true)

onEdit関数を書いておくと　保存時に実行されるらしい。トリガーの設定なんか要らんかったんや……。

「Googleのスプレットシートで変更した内容をGoogle Apps Script経由でチャットワークに通知するライフハック的なものを作った話。」Qiita
http://qiita.com/n0bisuke/items/ed99da94aba342af3cdc

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170407a13b1.png?raw=true)
ここをコメントアウトして　全体を onEdit関数にした。これで十分。

この JSON を フォーム送信したいぞ。はてさて。

# POST送信したいぞ

グーグル・スプレッドシートでは　「フォーム送信」は別の意味になるのか。じゃ、POST送信したいぞ。

「Google Apps ScriptからHTTP POST」Qiita
http://qiita.com/n0bisuke/items/a31a99232e50461eb00f

「Class UrlFetchApp」Google Apps Script
https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetch(String,Object)

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170407a14b1.png?raw=true)

こんな風に書いておけば POST送信されているんだろうか？
受け取り口の方を作っておかないと　分からん……。

# 受信側を PHP で書こうぜ？

「PHPでフォームからデータを受け取る方法（GETとPOST）」techacademy
https://techacademy.jp/magazine/4955

```php
<?php
if(isset($_POST['comment'])){
$comment = $_POST['comment'];
echo $comment;
}
?>
```

こんなんでいいのか？

書き直してみた。

try_post.php

```php
<?php
if(isset($_POST['datas'])){
    $datas = $_POST['datas'];

    // ファイル書込み
    $file = 'try_post_data.txt';
    // ファイルをオープンして既存のコンテンツを取得します
    $contents = file_get_contents($file);
    // ファイルに追記します
    $contents .= $datas . "\n";
    // 結果をファイルに書き出します
    file_put_contents($file, $contents);

    echo 'try post!(^q^)';
    echo $datas;
}
else
{
    echo 'no post-data!(^q^)' . "\n";
    $contents = file_get_contents('http://★サイトアドレス/try_post_data.txt');
    echo $contents;
}
```

try_post_data.txt を書き込み許可パーミッションで用意しておく。

# グーグル・スプレッドシートにメニューを追加しよう

```gas
// グーグル・スプレッドシートを開いたとき
function onOpen() {
  // メニューバーにカスタムメニューを追加
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [
    {name : "データを送信"  , functionName : "submitData"},
  ];
  spreadsheet.addMenu("ランキング", entries);
}

// メニューから実行する
function submitData(){
  // ここに処理を書く
}
```