Help us understand the problem. What is going on with this article?

[GAS]GoogleSpreadSheetとLineBotでTODO管理

More than 1 year has passed since last update.

経緯

社会人サークルとかで、エンジニア以外の人がいるような環境だと「TODO管理はしたいけど、Slackとかよくわからない」ということは多いと思います。
そんなときにLineのグループからTODO登録できたら便利だなーという発想のもと、
覚えたてのGASでLineからSpreadSheetにTODOを飛ばすBotを作ったので紹介です。

コード

// LINE Developers > Basic Information > Channel Access Token から取得
var channel_access_token = "your line bot token"; 

function doPost(e) {
  var posted_json = JSON.parse(e.postData.contents);
  var events = posted_json.events;
  events.forEach(function(event) {
    // コマンド書式判定
    if (event.message.type != "text" || isCommand(event.message.text) == false) {
      return;
    }

    var message = doTask(event.message.text);

    var postData = {
      "replyToken" : event.replyToken,
      "messages" : [
        {
          "type" : "text",
          "text" : message
        }
      ]
    };

    var options = {
      "method" : "post",
      "headers" : {
        "Content-Type" : "application/json",
        "Authorization" : "Bearer " + channel_access_token
      },
      "payload" : JSON.stringify(postData)
    };

    var reply = UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", options);
  });
};


// コマンド書式判定
function isCommand(text) {
  var isCommnadText = false;
  var reg =/^bot:[cuh]:/i;

  if (text.match(reg)) {
    isCommnadText = true;
  }

  return isCommnadText;
}

// TODOリストドキュメントの操作
function doTask(command) {
  var spreadsheet = SpreadsheetApp.openByUrl("your todo list url");
  var sheets = spreadsheet.getSheets();
  for ( var i in sheets ){
    if ( sheets[i].getSheetName() == "TODO" ) {
      return orderTask(command, sheets[i])
    }
    return;
  }
}

// 命令判定と実行
function orderTask(command, sheet) {
  var message = "";
  var order = command.split(":");
  switch(order[1]) {
    case "h":
      message = showHelp();
      break;
    case "c":
      if (order.length != 6) {
        message = "書式に誤りがあります。\n[bot:c:担当者:期限:TODO:状態]の形式で入力してください。";
      } else {
        message = addRow(order[2], order[3], order[4], order[5], sheet);
      }
      break;
    case "u":
       if (order.length != 4) {
        message = "書式に誤りがあります。\n[bot:u:ID:状態]の形式で入力してください。";
       } else {
         message = updateRow(order[2], order[3], sheet);
      }
      break;
    default:
      message = "書式に誤りがあります。\nbot:c:担当者:期限:TODO:状態\nbot:u:ID:状態\nの形式で入力してください。";
      break;
  }

  return message;
}

// 新規追加
function addRow(person, limit, todo, state, sheetObj) {
  var lastRow = sheetObj.getLastRow();
  var lastRowId = sheetObj.getRange(lastRow, 1).getValue();

  if (lastRowId == "id") {
    lastRowId = 0;
  }

  sheetObj.getRange(lastRow+1, 1).setValue(lastRowId + 1); // id
  sheetObj.getRange(lastRow+1, 2).setValue(person); // 担当者
  sheetObj.getRange(lastRow+1, 3).setValue(limit); // 期限
  sheetObj.getRange(lastRow+1, 4).setValue(todo); // TODO
  sheetObj.getRange(lastRow+1, 5).setValue(state); // 状態

  return "ID:" + (lastRowId+1) + "にタスクを追加しました。";
}

// ステータス更新
function updateRow(id, state, sheetObj) {
  var lastRow = sheetObj.getLastRow();
  var lastRowId = sheetObj.getRange(lastRow, 1).getValue();
  if (id > lastRowId) {
    return "タスクリストに存在しないIDです。\nID:" + lastRowId + "が最大です。";
  }

  idNum = Number(id);
  sheetObj.getRange(idNum+1, 5).setValue(state); // 状態

  return "ID:"  + id + "の状態を「" + state + "」に更新しました。";
}

// ヘルプ
function showHelp() {
  return "bot:c:担当者:期限:TODO:状態\nbot:u:ID:状態";
}

感想

  • これだとスマホ(特にフリック入力)から入力しづらいので、コマンドは再考の余地あり。

参考

先人の知恵に感謝:pray:

LINE Botをサーバーレスで開発!Google Apps ScriptとLINE Messaging APIを使ってチャットボットを作ってみた
初心者がGASでSlack Botをつくってみた

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away