4
4

【LINE✖️GAS】はじめてのGoogleAppsScript<protoout体験会資料>

Last updated at Posted at 2024-01-30

スクリーンショット 2024-01-30 4.09.58.png
この記事の内容を理解すればこんなLINEBotが簡単にできちゃいます!!

前々準備

  1. GoogleDriveにログイン
  2. LINE Developersにログイン
  3. OpenAIのAPIクレジット登録

前準備

  1. LINE公式アカウント作成
  2. OpenAI_key取得
  3. こちらのスプレッドシートをコピー

スクリーンショット 2024-01-30 2.14.28.png
4. 拡張機能からGoogleAppsScriptを立ち上げる

スクリーンショット 2024-01-30 2.15.47.png
こんな画面が出てくるはずです。
スクリーンショット 2024-01-30 2.18.58.png

※以降に出てくるコードはほとんど上記GASに既に記載されています。

おうむ返しBotを作ろう

必要なこと

  1. LINEチャンネルアクセストークンの貼り付け
  2. OpenAIのAPI_keyの貼り付け(厳密にはここでは必要ないですが準備としてまとめてやっちゃいましょう)
  3. デプロイ
function doPost(e) {
  let json = JSON.parse(e.postData.contents)
  let reply_token= json.events[0].replyToken;
  if (typeof reply_token === 'undefined') {
    return;
  }
  if (json.events[0].type == 'message'){
    const userMessage = json.events[0].message.text
    // ☆ここのメッセージを変更することで、返信内容が変更できる☆
    messages = [
      { type: 'text', 
        text: userMessage  
      }
    ]
    // ☆メッセージ内容はここまで☆
    sendmessage(messages, reply_token)
  }
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

function sendmessage(message, reply_token){
  UrlFetchApp.fetch(line_endpoint, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + LINE_CHANNEL_ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': reply_token,
      'messages': message
    })
  })
}

LINEに何か送ってみておうむ返しされたら成功!!
スクリーンショット 2024-01-30 2.26.42.png

自分の言葉に変えてみよう

messages = [
      { type: 'text', 
        text: userMessage + "ってどういうこと?"  
      }
    ]

「こんにちは」に対し「こんにちはってどういうこと?」と返ってきたら成功!

2つメッセージを返そう(オブジェクトの単位を学ぶ)

messages = [
      { type: 'text', 
        text: userMessage  
      },
       { type: 'text', 
        text: userMessage + "2回目" 
      }
    ]

「こんにちは」に対し「こんにちは」「こんにちは2回目」と返ってきたら成功!
2回目以降のデプロイは「デプロイの管理」を選択しましょう。Webhookの再設定は不要です。デプロイ前には必ずスクリプトが保存されていることを確認します。
スクリーンショット 2024-01-30 2.45.18.png
右上のペンのマークを押して「新バージョン」を選択します。
スクリーンショット 2024-01-30 2.48.28.png

いきなり応用!ChatGPTにメッセージを作ってもらおう

下記のような関数を作っておけば、contentで指示を書き、callChatGPT(userMessage)と書けばChatGPTが作成したメッセージが利用できます。

function callChatGPT(userMessage) {
  let system_content = `あなたは○○です(役割を設定)。${userMessage}に対して****のように回答してください。文字数は***。`
  const url = 'https://api.openai.com/v1/chat/completions';
  const options = {
    method: "post",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${OPENAI_API_KEY}`,
    },
    payload: JSON.stringify({
      model: "gpt-3.5-turbo",
      messages: [{ role: "system", content: system_content }, { role: "user", content: userMessage }],
    }),
  };
  const response = UrlFetchApp.fetch(url, options);
  const result = JSON.parse(response.getContentText());
  const text = result.choices[0].message.content.trim();
  return text;
}

このメッセージをmessagesの中に入れます。

messages = [
      { type: 'text', 
        text: callChatGPT(userMessage)
      }
    ]

2つの分岐を作ろう(○○だったらこう返信、✖️✖️だったら...)

function doPost(e) {
  let json = JSON.parse(e.postData.contents)
  let reply_token= json.events[0].replyToken;
  if (typeof reply_token === 'undefined') {
    return;
  }
  // もしユーザーが送信したもののタイプが「message」だったら
  if (json.events[0].type == 'message'){
    const userMessage = json.events[0].message.text
    if(userMessage == "東北東"){
          messages = [
      { type: 'text', 
        text: "大正解!"  
      }
    ]
    }else{
          messages = [
      { type: 'text', 
        text: "どーこ見て食べてんだよ"  
      }
    ]
    }
    // ☆メッセージ内容はここまで☆
    sendmessage(messages, reply_token)
  }
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

さらに分岐が増やしたい場合は、

function doPost(e) {
  let json = JSON.parse(e.postData.contents)
  let reply_token= json.events[0].replyToken;
  if (typeof reply_token === 'undefined') {
    return;
  }
  // もしユーザーが送信したもののタイプが「message」だったら
  if (json.events[0].type == 'message'){
    const userMessage = json.events[0].message.text
    if(userMessage == "東北東"){
          messages = [
          { type: 'text', 
            text: "大正解!"  
          }
    ]
    }else if(userMessage == "北北東"){
          messages = [
      { type: 'text', 
        text: "惜しい!"  
      }
    ]
    }else{
          messages = [
      { type: 'text', 
        text: "どーこ見て食べてんだよ" 
      }
    ]
    }
    // ☆メッセージ内容はここまで☆
    sendmessage(messages, reply_token)
  }
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

補足:カスタマイズ方法

ここまでの流れを理解できれば、様々な応用の仕方が可能です。

返信内容をカスタマイズ

messages = [
      { type: 'text', 
        text: callChatGPT(userMessage)
      }
    ]

これはテキストを返すコードですが、その他スタンプ、画像、位置情報などのタイプを選択することが可能です。詳しくはLINE公式ドキュメントをご参照ください。

イベントタイプやメッセージ内容をカスタマイズ

if分岐をどのように作るかで想定されるいろんなパターンに応用可能です。eventのtypeにはmessageの他にfollow(誰かが友だち追加したとき)、follow(誰かが友だち追加した)、postback(ユーザーからのアクション)などがあります。来たメッセージが画像だったら、メッセージに○○が含まれていたら、などシチュエーションによって分岐できます。

スプレッドシートをデータベースに使用

送信するメッセージの情報源としてスプレッドシートを使えばさらにバリエーションが増やせます。

体験会後自分でやっていて詰まったら

今は大概のことはChatGPTに聞けば解決してくれますが、解決しない場合自分で試せることが下記に書かれていますのでこちらもぜひご参考になさってください。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4