LINE×GAS｜今日の調子をクイックリプライで回答し、スプレッドシートに記録

:::note warn
本記事に記載のコードは全てを1から私が記載したわけではありません。
参考記事をもとに作成・追加改造を記録した記事です。
:::

# ゴール・完成形
LINE MessageAPI、GASを用いて、今日の調子をクイックリプライで回答し、スプレッドシートに記録するツールを作成。

<details><summary>LINE</summary>

![LINE画面.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687068/917a346b-b65e-d3aa-ab23-f2d8dce75154.gif)

</details>


<details><summary>スプレッドシート</summary>

![LINE→スプシ→notion_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687068/a9119063-a9f2-6ddf-efe2-7ac6c55c6e93.png)

</details>

<details><summary>コード</summary>

```js:record_feeling_to_SpreadSheet.gs
// ------------------クイックリプライボタンを設定したメッセージを送る------------------ //
function askFeeling_quick_reply() {
	/* スクリプトプロパティのオブジェクトを取得 */
	const prop = PropertiesService.getScriptProperties().getProperties();
 
	/* クイックリプライボタンを設定したメッセージを送る */
	UrlFetchApp.fetch('https://api.line.me/v2/bot/message/push', {
		'headers': {
			'Content-Type': 'application/json',
			'Authorization': 'Bearer' + ' '+ prop.LINE_TOKEN, //
		},
		'method': 'POST',
		'payload': JSON.stringify({
			"to": prop.LINE_USER_ID, // 
			"messages": [
				{
        "type": "text", // ①
        "text": "今日の気分はどう？",
        "quickReply": { // ②
    "items": [
      {
        "type": "action", // ③
        "action": {
          "type": "message",
          "label": "晴れ",
          "text": "$Feeling:晴れ"
        }
      },
      {
        "type": "action",
        "action": {
          "type": "message",
          "label": "曇り",
          "text": "$Feeling:曇り"
        }
      },
      {
        "type": "action",
        "action": {
          "type": "message",
          "label": "雨",
          "text": "$Feeling:晴れ雨"
        }
      }
    ]
  }
}	],
			"notificationDisabled": false // trueだとユーザーに通知されない
		}),
	});
}



// ------------------クイックリプライで回答してスプレッドシートに記録する------------------ //
var sheet;

function doPost(e) {
  var userMessage = JSON.parse(e.postData.contents).events[0].message.text;
   
  if(userMessage.match(/^\$/)) {
    userMessage = userMessage.substr(1);
  } else {
    return;
  }
   
  var spreadsheetId = "16NNUTPhqIUbSBYNoN4BsdhPIjxxMjknjHkPSJtQd-3E";
  var sheetName = "Line_to_SpreadSheet";
  var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
  sheet = spreadsheet.getSheetByName(sheetName);
 
  // 書き込み処理
  setData(userMessage);

  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
 
}

function setData(msg)
{
  let data = msg.split(/\n/);
  let row = sheet.getLastRow() + 1;

  let playerNum = 30;
  let startCol = 2;
  let cells = sheet.getRange(1, startCol, 1, startCol + playerNum);

  // 日付
  let dateCell = sheet.getRange(row, 1);
  dateCell.setValue(new Date());

  // スコア書き込み
  data.forEach(function(key){
    let scores = key.split(/:/);
    let name = scores[0];
    let score = scores[1];
    let col = getPlayerCol(cells, name);

    setScore(col, row, score);
  });
}

function setScore(col, row, score)
{
  //  プレイヤー人数が想定を超えている
  if(col == 0){
    return;
  }

  let cell = sheet.getRange(row, col);
  cell.setValue(score);
}

function getPlayerCol(cells, name)
{
  let row = 1;
  for (var col = 1; col <= cells.getNumColumns(); col++) {
      var cell = cells.getCell(row, col);
      if (cell.getValue().match(name)) {
        return cell.getColumn();
      }else if(cell.getValue() == ""){
        // 新規プレイヤー
        cell.setValue(name);
        return cell.getColumn();
      }
  }
  return 0;
}
```

</details>


<details><summary>スクリプト プロパティ</summary>

![LINE→スプシ→notion_-_プロジェクトの設定_-_Apps_Script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687068/d0e74d06-384f-24a0-c09c-fb4ece10dda2.png)

</details>


# 感想・課題
参考記事をもとにコードをいじってるのだが、想定している動きにならない。
コードが何をしているのかはわかるが、構文がわからないから、応用・改造がしんどい。。。。

本当はスプレッドシートに記録した内容をNotionに転記したい。


# 参考

https://www.pnkts.net/2018/06/03/line-messaging-api/#LINE-Bot%E3%81%AE%E8%BF%94%E4%BF%A1reply%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86

https://took.jp/line-spreadsheet/