質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

Q&A

解決済

1回答

2903閲覧

SlackとGASを連動して、ある特定の言葉の後に反映させたい言葉を入力するとスプレッドシートに書き込まれるようにしたいのですが、上手くいきません。

LocZip

総合スコア5

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

0グッド

0クリップ

投稿2018/05/15 13:40

突然すみません。
SLACK上である特定の文字を入力すると、その特定の文字のあとの言葉がスプレッドシートの何行目何列目に配置される
というのを書いているのですが途中で訳がわからなくなってしまいました。

function doPost(e) {
var text = e["parameter"]["text"];
var value = text.replace("NAME@", "");
value = value.replace(/\s/g, "+")
var ss_url = "ここにはURL";
var ss = SpreadsheetApp.openByUrl(ss_url);
var sh = ss.getSheets()[0];
var row = sh.getLastRow();
var next_row = row + 1;
sh.getRange("A" + next_row).setValue(value);
if(text.replace("TD@", "")){
sh.getRange("B" + next_row).setValue(value);
}
reply(ss_url, row);

というコードができたのですが、なかなかうまくいきません。
どのような風にして入力をしたいかというと

SLACKの入力フォーム
NAME@ABC
TotalA@2:00:00
TotalB@2018/12/1
TotalC@2018/12/2



このような感じで入力すると
NAME@abcは Aの最終行にabcと
TotalA@2:00:00は Bの最終行に2:00:00
以下略

とこんな改行でも対応できるようにしたいのです。
現状だと、AとBの最終行に同じ文字が入力されてしまいます。

条件分岐等を試してみたのですが、うまく行かなかったのでアドバイスをいただきたいです。

今躓いている点は
・ある特定以外の言葉を入力しない限り、スプレッドシートに反映させるにはどうしたらよいか。
・改行した場合でも反映されるにはどうしたらよいのか
・どんな言葉でも反映されてしまう。

どうかよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問事項らしきところに回答を

  • 現状だと、AとBの最終行に同じ文字が入力されてしまいます。

javascript

1if(text.replace("TD@", "")){ 2sh.getRange("B" + next_row).setValue(value); 3}

のところですが、すこーし前にあるようにvar value = text.replace("NAME@", "");みたいにしなければ「TD@」の後ろの文字は拾えません。
また、深読みしているのかもしれませんが、NAME@とTD@が一度に送信されないと(slackの送信ボタン一回で複数行まとめて送信しないと)textの中にはTD@の部分は含まれないことになりますが、大丈夫でしょうか?

  • ある特定以外の言葉を入力しない限り、スプレッドシートに反映させるにはどうしたらよいか?

◆どうやってslackからgasに送信しているかにもよりますが、例えばoutgoingwebhookを使っておられるとすれば、開始キーワードが指定できると思います。もし、違う方法で送信され、そのようなフィルタリングがきかない(またはどうしても最初にあるキーワードでは判定できない)のであれば、var text =の次の行くらいでtextに○○が含まれたら(if~)、処理を抜ける(returnする)とする方法も考えられます。

  • 改行した場合でも反映されるにはどうしたらよいのか?

◆slackのメッセージが改行されているということでしょうか?javascriptの理解にもよりますが、記載されているコードからすれば、正規表現が理解できるようですので、正規表現で取り出すことができると思います。あるいはsplitで分割することもできると思います。
一方で、どうしても改行でなければならない具体的な要因や制限がないのであれば、slackの入力を自分でハンドリングできる形式にするということもできるのではないかと思います。改行が唯一のネックなのであれば(そして入力値が一定の範囲内なのであれば"Name@xxx改TD@2:00:00"など(改)=改行や(区)=区切りを使うとかいった解決も可能かと思います。
(詰まったときは、"改行がなければできるのか"、を考えてみてください。改行がなくてもできないのであれば、本当に解決すべき問題は改行ではありません。逆に改行がなければできるなら、"なぜ改行が必要なのか"を考えてみてください。必要なのであればその理由を示してください)

  • どんな言葉でも反映されてしまう。

◆これは1つめの・の「特定の言葉を条件判定にしたい」ということと同じではないでしょうか?

--追記
slackで

NAME@xavier TD@12:23:56

という入力がなされるとして(rの後に改行があることを前提とします)、slackからoutgoingwebhookが飛び

javascript

1function doPost(e) { 2 var text = e["parameter"]["text"]; 3 var value = text.split("\n")[0].replace("NAME@", ""); //改行で区切ってその0番目を取り、そこから"NAME@"を消す 4 var value2 = text.split("\n")[1].replace("TD@", ""); 5 value = value.replace(/\s/g, "+") 6 value2 = value2.replace(/\s/g, "+") 7 var ss_url = "スプレのURL"; 8 var ss = SpreadsheetApp.openByUrl(ss_url); 9 var sh = ss.getSheets()[1]; 10 var row = sh.getLastRow(); 11 var next_row = row + 1; 12 if(text.indexOf("NAME@") != -1){ 13 sh.getRange("A" + next_row).setValue(value); 14 } 15 if(text.indexOf("TD@") != -1){ 16 sh.getRange("B" + next_row).setValue(value2); 17 } 18}

というコードで受ければ、A1,B1セルにそれぞれ[xavier, 12:34:56]と入ると思います。
(Slackからの送信はテストしていませんが、3行目以降相当のコードは検証しています。

投稿2018/05/16 08:39

編集2018/05/17 04:54
papinianus

総合スコア12705

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

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

LocZip

2018/05/17 03:38 編集

返信ありがとうございます。 ちょっと昨日からずっと試行錯誤していたのですが TD@aaa と仮に打ったとしてもA列の最終行に入ってしまいます。 申し遅れましたがSlackとGAS間はOutgoingWebHookを利用しています。 function doPost(e) { var text = e["parameter"]["text"]; var value = text.replace("NAME@", ""); var value2 = text.replace("TD@", ""); value = value.replace(/\s/g, "+") value2 = value2.replace(/\s/g, "+") var ss_url = "スプレのURL"; var ss = SpreadsheetApp.openByUrl(ss_url); var sh = ss.getSheets()[1]; var row = sh.getLastRow(); var next_row = row + 1; if(text.indexOf("NAME@")){ sh.getRange("A" + next_row).setValue(value); }else if(text.indexOf("TD@")){ sh.getrange("B" + next_row).setvalue(value2); } 一応HOOK上のトリガーには引っかるのですが、TD@がreplaceされないのと、B列に行かないのが現状です。 もしよろしければ助言をお願いします・・・。
papinianus

2018/05/17 04:56

ここだとコードが見辛いので回答に追記しました。 なお、slackからどのような文字がくるかは質問などからの想定ですので、実際どうなっているか、未加工のそのままがないと求める動作をしない可能性があります(改行の有無や行数によって、全く想定外の結果になります)
LocZip

2018/05/21 08:10

今試したところ、できました!! 本当にありがとうございます。ものすごくためになりました。 また何かありましたらよろしくおねがいします。
papinianus

2018/05/21 08:31

解決したら、解決扱いにしていただけると、他の方が参考になるのか途中なのか分かりやすいですのでおねがいします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問