【初心者向け】GAS✖️LINEで詰まったら、もはやChatGPTにベタ貼りでほぼ解決するけど、自分で解決するならこれ

## はじめに
こんにちは、新米エンジニアのうえだです。
GoogleAppsScript（通称GAS）×LINEでの開発は初心者にとっても取り掛かりやすいですが、初心者だとエラーばっかりで進まないということが多々あります。

## おーい
よーしLINEBot作るぞー！GASで書けたぞ！
テストだ！
<img width="200" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653579/71ee7756-a98d-bc1c-a093-3c3b287841e7.jpeg">
あれ？
<img width="200" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653579/0fbcafa3-3124-cf39-5480-5290267ebf70.jpeg">

なんてこと、初心者の方だと経験あると思います（私も幾度となく経験しました）。

今の時代は書いたコードそのままChatGPTにベタ貼りすればここがおかしいと瞬時に見つけてくれることが多いですが、それでも解決しない場合に試してほしい方法が2つあります。
**1. logSheetの作成**
**2. functionごとの実行**
です。

## logSheetの作成

*  対象のスプレッドシートに「log」シートを作ります
*  GASの初めの定義に下記を加えます。
```javascript
const logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('log')
```
* コードの中に下記をあちこちに書きます
```javascript
logSheet.getRange("セル指定").setValue("直前の動作")
```
これでどこでエラーが起きているか分かります。
例えば、[この記事](https://qiita.com/cog1t0/items/ce21c80626af47c1c1d0)のLINEBotを作っていて「おまかせ」と送信しても返信が来ないとします。
まず、function doPost(e){ の後に
```javascript
logSheet.getRange("A1").setValue("doPost")
```
と加えます。
「おまかせ」と送信した時にlogSheetのA1にdoPostと書かれているか確認します。
これがない場合はそもそもLINEがつながってないので、`チャンネルアクセストークンが違う、Webhook設定ができていない`可能性が高いです。そこをもう1度見直してください。よくあるのは、長いチャンネルアクセストークンのコピペミス、WebhookをLINEdevelopersに貼っていない、Webhookが有効設定になっていないなどです。

doPostができている場合はif分岐や変数の定義などでのエラーが考えられるので、「おまかせ」のif分岐にいき、
```javascript
target_rows = searchDataByScore(sheet, 69, 3);
logSheet.getRange("A2").setValue(target_rows)
target_rows = randomSelect(target_rows) 
logSheet.getRange("A3").setValue(target_rows)
```
とかやってくと、logSheetに書き込みされないところがエラー部分なのでそこを見直せばよいということになります。
これでもしA2には書き込みがあり、A3にない場合はrandomSelect関数がおかしいのでは？ということです。
1行ごとに足すとすぐにどこがダメかわかりますが、めんどくさければ何箇所か選んで足してもよいです。

## functionごとの実行

logSheetでの確認は実際にLINEのメッセージを送信する必要がありましたが、こちらはその必要がありません。
スクリプトを保存すると、デバッグの右側に保存した関数が選択できるようになります。（doPostの部分）
<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653579/27a5f62f-65fd-7916-1b03-409a6885e3f7.png">
例えば下のような関数があるとします。
```javascript
function searchredinumbers(number) {
  var matchedRows = [];
  for (var i = 1; i <= 1000; i++) {
    if (listsheet.getRange(i, 4).getValue() == number) {
      matchedRows.push(i);
    }
  }
  return matchedRows;
}
```
引数を実際に入れた方が挙動が分かり易いので、少し書き換えます。
具体的には引数をなくして、引数となる部分を実際の値にする、console.log部分を足します。
```javascript
function testsearchredinumbers() {
  let number = 1592  //引数
  let matchedRows = [];
  for (var i = 1; i <= 1000; i++) {
    if (listsheet.getRange(i, 4).getValue() == number) {
      matchedRows.push(i);
    }
  }
  console.log(matchedRows)//追加
  return matchedRows;
}
```
console.logの部分は上に書いたlogSheetへの記載でもいいですが、実行した時にconsole.logだとそのままの画面でログが見られるので一手間（スプレッドシートを開く）楽になります。
<font color="#ff0000">**ここで困るのはfunction doPost(e)ではないでしょうか？**</font>
eは送信されたデータなのでLINEを動かさない状態では実行できませんし、上のように簡単に引数を書くこともできません。
そんな時はeのサンプルをもらいに行けばよいのです！
function doPost(e){ の後に
```javascript
logSheet.getRange("B1").setValue(e.postData.contents)
```
を追加します。この状態でLINEに何か送信すると、`{"destination":"`で始まる長い文字列(json) がlogSheetのB1に記載されるのでそれをそのままコピーして引数に使いましょう。

## おまけ
以下、私の経験です。
* 全然動かずどこがおかしいか悩んでいたら、logSheetをlogsheetと書いていた。
 バグ対応するためのコードでバグが起きているというまぬけなミスです。
* コードを書き換えたのにデプロイを忘れている。
 コード変えたのにやっぱり動かないかと思ったらってやつですね。