GASとLINEAPIでハマったときの対処法

※初投稿により改善等あればご指摘お願いします。

#現状
・プログラミング好きだけど、そこまで何かやったというものは特になし
・Python,Matlabを大学の授業で使用する程度
・あることからGASを使い始め、GASの便利さに気付きもっといろんなことをしたいと思うようになった。
・そこでLINEmesseagingAPIを使ったプログラミングをすることにした。

使用参考書：「独学プログラマーであるためのAIアプリ開発がわかる本」/著　河合　大 2019年3月18日出版

#この本にした理由
・使用言語がGASであること
・API通信があったこと
・50行程度のプログラミングの中にいろんな知識が含まれていたこと
・単純に面白そうだったから

#行ったこと
・本に書いてあったプログラミングコードの写経
・実行してエラー出たら、プログラムの見直し、ウェブサイトで解決法の検索

#実際のプログラミングコード

``` gas:qiita&#x20;moji.gs
function doPost(e) {
  const LINE_ACCESS_TOKEN = "YOUR_LINE_TOKEN";
  const lineJson = JSON.parse(e.postData.contents);
  const replyToken = lineJson.events[0].replyToken;
  const messageId = lineJson.events[0].message.id;
  const lineImageUrl = "https://api.line.me/v2/bot/message/" + messageId + "/content/";
  const lineImageResponse = UrlFetchApp.fetch(lineImageUrl, {
    'headers':{
      'Content-Type': 'application/json; charset=UTF-8',
      "Authorization": "Bearer " + LINE_ACCESS_TOKEN
    },
    'method': 'get'
  })
  .getContent();
  
  const lineImageBlob = Utilities.base64Encode(lineImageResponse);
  const API_KEY = 'YOUR_API_KEY';
  const visionRequestUrl = 'https://vision.googleapis.com/v1/images:annotate?key=' + API_KEY;
  const payload = JSON.stringify({
    "requests":[
      {
        "image":{
          "content":lineImageBlob
        },
        "features":[
          {
            "type":"TEXT_DETECTION",
            "maxResults": 1
          }
         ]
        }
      ]
    });
  const visionTextResponse = UrlFetchApp.fetch(visionRequestUrl,{
    method:"POST",
    contentType:"application/json",
    payload:payload,
  })
  .getContentText();
  const visionTextJson = JSON.parse(visionTextResponse);
  const visionText = visionTextJson.responses[0].fullTextAnnotation.text;
  Logger.log(visionText);
  const messages = [
    {
      "type":"text",
      "text":visionText,
      "muteHttpExceptions":true
    }
   ]
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", {
    "headers": {
      "Content-Type": "application/json; charset=UTF-8",
      "Authorization": "Bearer " + LINE_ACCESS_TOKEN,
    },
    "method":"post",
    "payload": JSON.stringify({
      "replyToken": replyToken,
      "messages": messages,
    })
  });
}       
```

#実際に出たエラーと対処法
###TypeError: Cannot read property 'postData' of undefined at doPost
→調べてみ見ると、これはLINEmessageingAPIからPOSTデータの送信から得られるもので、エディタ内部で実行してしまうと、
`JSON.parse(e.postData.contents)`
の部分で`undefined`と返ってくるらしい。
そのため以後無視することにした。

###Webhookイベントオブジェクトを送信したときにエラーが発生しました
これはLINEmessagingAPIと上記のプログラムを紐づける際に起こったエラー
→要は、LINEのAPI側からWebhookに指定したURLを送る
↓
エディタのdoPost関数にたどり着かずに追い返される
↓
上記のようなエラーが出る

解決方法：プログラムコードを新たに書き直した
しかしこのようなことはしなくてもいいと、ウェブサイト探し回ってたら発見した。

Webhookに紐づける際のURLはスクリプトを書き直したら必ず、
GASの「公開」→「ウェブアプリケーションとして導入」から
プロジェクトバージョンの部分を「NEW」にしてから更新しないといけないのに、
ずっと「1」のまま、「更新」ボタンを押していたため、URLが変わることなく、古いプログラミングコードのままWebhookに指定していたことが原因だと考えられる。

実際に、そこを直して解決した。

https://uncle-atsushi.com/gas_first-execute_dopost-doget/
↑の補足部分を見れば解決するはず。

###スペルミス
本書と照らし合わせた。

#この本で得られたこと
・API通信の理解と心的ハードルの軽減
・JSON形式の通信方法を理解
・エラー対処力
・LINEのAPIの使いやすさ

#最後に
`Logger.log()`でエラー部分を確かめる方法もありやってみたが、なぜか実行できず結局は一個一個探し回っていた羽目に、、

自分はエラーの二つ目のWebhook設定によりかなり時間を食っていた。
（一番タチが悪かったのが、「Webhhok設定での接続確認で「成功」と出ていたのに画僧を送ってもうまく作動しなかったこと」）かなりむかつく！！

少しでも同じ罠にはまっている人がなるべく時間をかけずに解決できるように今回この記事を書いた。

自分も同様、エラーが長時間見つからないということになるとプログラミング初心者にはかなり精神的苦痛が出てきて「自分には向いていない」という思いが芽生えてくる。

自分もこのエラーループに陥り２，３日別のことをやっていた。
しかし、解決して実行できた時の達成感と感動は考えられないくらいうれしいものである。

今回のこのプログラミング自体はそこまで長くないし、初学者にとっても少し大変かもしれないができたときの成長した感じがたまらなく好きなのでまた随時更新していこうと思う。