@osagari

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【初心者】LINE公式アカウント作成のためのGAS構築

解決したいこと

初めまして。
GASは多少使用したことがあります
心を折りながら、3日間缶詰で、LINE公式アカウントを作成するための独学を行い、下記のYoutubeを参考に作成しましたが、形にならず泥沼化しました。
https://www.youtube.com/watch?v=gb5O2p1hckw&list=PLvxt5blstF8-9eRcZhh4dPCGVYqv4x9eo&index=4

しかし、

構築したいアカウントの仕様

・公式アカウントを友達登録した際に、3問のアンケート(属性・年齢・性別)を選択式で実施。
 リッチメニューは初期Aパターン。
  IDとユーザーネームを自動取得し、回答と併せてスプレッドシートに記載。
・属性(回答:A・B)をもとにタグ付けする
 Aにはリッチメニューの表示はタブBとタブC
  Bにはリッチメニューの表示はタブBとタブD

なんとか、ここまで作りたいんです。
もう少しだけ頑張る力を振り絞るので、温かくご助言いただけると幸いです。
何卒、助けてください。

該当するソースコード

GAS

例)

const bot = new LineBotSdk.client("チャンネルアクセストークン");
function createRichMenu() {
  let richmenu = bot.richmenu({
    "name": "リッチメニュー",
    "barText": "メニュー",
    "size": { "width": 2500, "height": 1686 },
    "selected": true, 
    "areas": [
      bot.area({ "x": 0,    "y": 0, "width": 1250, "height": 350,
      "action": bot.aSwitch({"aliasId": "switch-to-a", "data": "change to A"}) }),
      bot.area({ "x": 1250, "y": 0, "width": 1250, "height": 350,
      "action": bot.aSwitch({"aliasId": "switch-to-b", "data": "change to B"}) }),
    ]
  })
  let res = bot.createRichMenu(richmenu);
  console.log(res.toString());
}

function uploadRichmenuImage() {
  const file = DriveApp.getFileById("画像ID");
  const blob = Utilities.newBlob(
    file.getBlob().getBytes(),
    file.getMimeType(),
    file.getName()
  );
  bot.setRichMenuImage("リッチメニューID", blob);
}


自分で試したこと

AWSやJABAでもできるとみて、ダウンロードを行いましたが、仮想環境を作るというところで挫折をしました。ChatGPTにも頼りましたが解決せず、本当に苦しいです。

0 likes

1Answer

何ができていて何ができていない・分かっていないんでしょうか?

たとえば、以下のステップで単純な bot から徐々に目的の bot になるよう機能を追加していくとしたとき、どこまではできますか?

  • 友達登録したときに単純な(ボタン1個などの)リッチメニューを表示し、入力を受け取るが何もしない
  • 正式なアンケートのリッチメニューを表示し、入力を受け取るが何もしない
  • 〜ここまで bot の基本的な作り方の話〜
  • アンケートを実施して、入力を捨てて関係ない簡単な定型値をスプレッドシートに挿入する
  • アンケートを実施して、入力をスプレッドシートに挿入する
  • 〜ここまでスプレッドシートとの連携の話〜
  • 入力をもとに属性をつけるがリッチメニューの表示までは変えない
  • 入力をもとに属性をつけてリッチメニューの表示を変える
  • 〜ここまで入力を元に動作を変える話〜
1Like

Comments

  1. @osagari

    Questioner

    知識がないためにどのように切り分ければよいかわからないまま、心が折れるあまり整理もできていませんでした。アドバイスをいただき、なんとかメンタルを保てています、ありがとうございます。

    再度、提示いただいたステップで挑戦してみました。
    残念ながら、STEP1で実装ができません。

    試したこと
    ①Youtubeのコードを参考に入れ込む
    参考:https://note.com/fuku_fk/n/n70e6985843ea
    →GASは通りましたが、LINEのWebhook URL検証にてエラーが表示されます。
    (LINE)ボットサーバーから200以外のHTTPステータスコードが返されました。(401 Unauthorized)
    LINEプラットフォームから送信されたHTTP POSTリクエストに対してボットサーバーがステータスコード200を返すことを確認してください。詳しくは、Messaging APIリファレンスのレスポンスを参照してください。

    また、GASにて実行を押すたびに、リッチメニューIDが結果に再表示されますが、毎回異なるのはなぜか、置き換える必要があるのか日介しておりません。

    ■コード
    const bot = new LineBotSdk.client("チャンネルトークン");
    function createRichMenu() {
    let richmenu = bot.richmenu({
    "name": "リッチメニュー",
    "barText": "メニュー",
    "size": { "width": 2500, "height": 1686 },
    "selected": true,
    "areas": [
    bot.area({"x": 0, "y": 0, "width": 625, "height": 561,
    "action": bot.aMessage({"text": "テキスト"}) }),
    bot.area({"x": 625, "y": 0, "width": 625, "height": 561,
    "action": bot.aUri({"uri": "https://script.google.com"}) }),
    ]
    })
    let res = bot.createRichMenu(richmenu);
    console.log(res.toString());
    }

    // デフォルト表示
    function setDefaultRichMenu() {
    bot.setDefaultRichMenu("ちっりメニューID");
    }

    //画像アップロード
    function uploadRichmenuImage() {
    const file = DriveApp.getFileById("画像URL");
    const blob = Utilities.newBlob(
    file.getBlob().getBytes(),
    file.getMimeType(),
    file.getName()
    );
    bot.setRichMenuImage("リッチメニューID", blob);
    }
    ーーーーーーーーーーーーーーーーーーーーーーーー

    ②GTPに相談しながら、コードを作り入れ込む
    →下記のようなエラーが表示され、実行できず
    (GAS)Exception: Request failed for https://api.line.me returned code 400. Truncated server response: {"message":"The value for the 'userId' parameter is invalid"} (use muteHttpExceptions option to examine full response)
    linkRichMenuToUser @ 無題.gs:58
    createRichMenu @ 無題.gs:27

    (LINE)ボットサーバーから200以外のHTTPステータスコードが返されました。(401 Unauthorized)

    LINEプラットフォームから送信されたHTTP POSTリクエストに対してボットサーバーがステータスコード200を返すことを確認してください。詳しくは、Messaging APIリファレンスのレスポンスを参照してください。

    ■コード
    const ACCESS_TOKEN = "チャネルアクセストークン"; // チャネルアクセストークンを入力

    function doPost(e) {
    const event = JSON.parse(e.postData.contents).events[0];

    if (event.type === "follow") {
    const userId = event.source.userId;
    createRichMenu(userId);
    }
    }

    function createRichMenu(userId) {
    const richMenu = {
    "size": { "width": 2500, "height": 843 },
    "selected": true,
    "name": "Simple Menu",
    "chatBarText": "メニュー",
    "areas": [
    {
    "bounds": { "x": 0, "y": 0, "width": 2500, "height": 843 },
    "action": { "type": "message", "text": "ボタンを押しました" }
    }
    ]
    };

    const richMenuId = createRichMenuAPI(richMenu);
    linkRichMenuToUser(userId, richMenuId);
    }

    function createRichMenuAPI(richMenu) {
    const url = "https://api.line.me/v2/bot/richmenu";

    const options = {
    "method": "post",
    "headers": {
    "Authorization": Bearer ${ACCESS_TOKEN},
    "Content-Type": "application/json"
    },
    "payload": JSON.stringify(richMenu)
    };

    const response = UrlFetchApp.fetch(url, options);
    const richMenuId = JSON.parse(response.getContentText()).richMenuId;
    return richMenuId;
    }

    function linkRichMenuToUser(userId, richMenuId) {
    const url = https://api.line.me/v2/bot/user/${userId}/richmenu/${richMenuId};

    const options = {
    "method": "post",
    "headers": {
    "Authorization": Bearer ${ACCESS_TOKEN},
    "Content-Type": "application/json"
    }
    };

    UrlFetchApp.fetch(url, options);
    }

  2. →GASは通りましたが、LINEのWebhook URL検証にてエラーが表示されます。
    (LINE)ボットサーバーから200以外のHTTPステータスコードが返されました。(401 Unauthorized)

    Webhook の設定に関する手順が動画やページに見当たりませんが(そして Webhook を処理するコードも bot に書いていないようですが)何を参考にしていますか?

    また、GASにて実行を押すたびに、リッチメニューIDが結果に再表示されますが、毎回異なるのはなぜか、置き換える必要があるのか日介しておりません。

    リッチメニューを新しく作る処理を何度も実行して、それぞれに ID が発行されているからです。デフォルトのリッチメニューを設定するなら1個作ってその ID を後々使えば十分です。

    ユーザー単位のリッチメニューを作る場合はまた話が異なりますが、これは公式のガイドも参照してください https://developers.line.biz/ja/docs/messaging-api/use-per-user-rich-menus/

    GTPに相談しながら、コードを作り入れ込む
    →下記のようなエラーが表示され、実行できず

    userId が不正だというエラーです。 LINE からの Webhook を受け取ってレスポンスを返すコードのようですが、手動で実行していませんか?その場合は userId が空になるのでエラーが出ます。

  3. @osagari

    Questioner

    ①Webhook の設定等については、同じ方のyoutubeやnoteの他のページを参考に作成しました
    https://www.youtube.com/watch?v=LHwJBpxorAg&list=PLvxt5blstF8-9eRcZhh4dPCGVYqv4x9eo&index=1

    また、コードを載せる際は、IDやURLはのせたままでよいかわからず、念のため文字に置きなおしています。

    リッチメニューを新しく作る処理を何度も実行して、それぞれに ID が発行されているからです。
    こちらは、コードのlet richmenu = bot.richmenu({~~
    が該当する箇所であり、IDを獲得・// デフォルト表示 function setDefaultRichMenu() {、~に当てはめたら
    GASからコードを削除してしまってよいということでしょうか…?

    毎回作成している、ということは説明からも理解できておらず、思いつかなかったため、目からうろこです…っ

    userId が不正だというエラーです。 LINE からの Webhook を受け取ってレスポンスを返すコードのようですが、手動で実行していませんか?その場合は userId が空になるのでエラーが出ます。
    userIDが取得できていない、ということでしょうか。自動でIDを取得するようなコードを追加したら、解決されるという認識ですが、あっていますでしょうか…

    また、手動で実行せず、確認する方法を教えていただけたら、とても幸いです。

Your answer might help someone💌