本記事に記載のコードは全てを1から私が記載したわけではありません。
参考記事をもとに作成・追加改造を記録した記事です。
ゴール・完成形
LINE MessageAPI、GASを用いて、今日の調子をクイックリプライで回答し、スプレッドシートに記録するツールを作成。
コード
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;
}
感想・課題
参考記事をもとにコードをいじってるのだが、想定している動きにならない。
コードが何をしているのかはわかるが、構文がわからないから、応用・改造がしんどい。。。。
本当はスプレッドシートに記録した内容をNotionに転記したい。
参考