🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

1025閲覧

LINEの投稿を先頭文字をタグに、2枚のsheet(1つのSpreadsheet)に振り分ける方法

SnowMonkey

総合スコア53

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2020/12/12 15:26

編集2020/12/12 23:45

前提・実現したいこと

https://chusotsu-program.com/line-gas/を参考に
先頭の文字を手掛かりに、LINEの投稿(クイズの出題と答え)を
Googleスプレッドシートに保存しようとしています。

上記サイトと違い、
0. 2つの先頭の文字($,%)に対応させ、その文字を除去したうえで
0. $で始まる投稿内容(問題文)は、questionsという名のシートに
0. %で始まる投稿内容(解答)は、answersという名のシートに分けて保存しようと思います
(同じブック上の2つのシートです)

なお
問題文(通し番号、問題文、ヒント)は1日に数問分、
解答((通し番号、正答)×問題数)は1日に1回、投稿されます。

LINE Messaging APIなどの設定はできていると思います。

発生している問題・エラーメッセージ

2つの先頭の文字($,%)で始まる投稿を拾い上げ、同じシートに保存するまではできたのですが、
別々のシートに保存しようとしたところ、$で始まる投稿を拾わなくなり、
%で始まる投稿は、両方のシートに保存されてしまうようになりました

文字ごとにbotを用意すべきでしょうか

該当のソースコード

Google

1 2function doPost(e) { 3 let answerMessage; 4 5 // 投稿されたメッセージを取得 6 let userMessage = JSON.parse(e.postData.contents).events[0].message.text; 7 8 if(userMessage.match(/^$/)) { 9 // $から始まるメッセージの場合、$を除いた文字列を再代入 10 userMessage = userMessage.substr(1); 11 } else if(userMessage.match(/^%/)) { 12 // %から始まるメッセージの場合、%を除いた文字列を代入 13 answerMessage = userMessage.substr(1); 14 }else{ 15 // $や%から始まらない場合は何もしない(処理終了) 16 return; 17 } 18 19 // スプレッドシートへ保存======================================= 20 21 const spreadsheetId = "スプレッドシートのID"; 22 const sheetName = "questions"; 23 const spreadsheet = SpreadsheetApp.openById(spreadsheetId); 24 const sheet = spreadsheet.getSheetByName(sheetName); 25 const sheet2 = spreadsheet.getSheetByName('answers'); 26 27 // 空白・タブ・改行で区切り配列に変換 28 let arr1 = userMessage.split(/\s/); 29 let arr2 = answerMessage.split(/\s/); 30 31 // 配列の先頭に日時を代入 32 arr1.unshift(new Date()); 33 arr2.unshift(new Date()); 34 // セルの最下部に配列を転記 35 sheet.appendRow(arr1); 36 sheet2.appendRow(arr2); 37 // ======================================= 38 39 return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); 40 41}

試したこと

$で始まる投稿を収納するための変数を用意したりしましたが、上手くいきませんでした。
修正が反映されるよう、webアプリとして公開のバージョンを新しくするなど

補足情報(FW/ツールのバージョンな

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

別々のシートに保存しようとしたところ、$で始まる投稿を拾わなくなり、
%で始まる投稿は、両方のシートに保存されてしまうようになりました

% のほうは自明ですね。文字列から % を切り取ったあと、何のフラグ変数もなく、appendRowを必ず2回実行しているので。かりに $ が拾えない問題が解消しても いまのコードだと$も両方に書き込まれると期待されます。
($の方を考えてて思いついたんですが、%の場合にquestionsシートにかかれているデータは%が先頭に含まれていませんか)

$ のほうは、answerMessage を最初に宣言だけしていて、それにsplitをかけているので、undefined.splitが実行できないエラーになっていそうです。

対応方法としては、初期化時に空文字で初期化する、ifで条件分岐するなら、その状態をなんとか管理して、必要な方の処理だけを実行するようにする、とかですかね。

投稿2020/12/13 03:06

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SnowMonkey

2020/12/13 04:03

そうです。%で始まる投稿をしたとき、questionシートに書き込まれてしまう不要データには、%が先頭に含まれていました。 変数answerMessage を空文字に初期化、同様に変数questionMessageを宣言して、$、%両方ひらうことができるようになりました。ただ、両方とも2つのシートに書き込まれるようになってしまいました。 これはおそらくappendRowを必ず2回行っているからだいうことですね。
SnowMonkey

2020/12/13 04:50 編集

papiniausさんのご指摘を受け、上記の変更に加え、if分の中に、セル下部への転記などの処理を入れることで、狙った通りの処理ができるようになりました。ありがとうございます。 プログラミングに詳しい人間が周りにいないため、とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問