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

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

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

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

Slack

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

Q&A

解決済

1回答

3692閲覧

【GAS】特定の列に特定の文字列が入力された時に、Slackにその行の情報を通知する

satoru.c

総合スコア1

Google Apps Script

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

Slack

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

0グッド

0クリップ

投稿2022/04/30 07:22

編集2022/04/30 07:26

契約が完了する度に、GoogleスプレッドシートのA列からF列まで下記の情報が自動で入ります。
A:完了日時
B:名前
C:メアド
D:商品名(2種類。仮に商品a、商品bとする)
E:会社名
F:電話番号

これらが自動で入力された時に、商品名に従ってそれぞれのメッセージをIncomingWebhookでSlackに通知するようにGASを描きたかったのですが、うまくいかなかったため、ご教示いただきたいです。

当方、非エンジニアのため、ググってなんとかしようとしていたのですが、
https://businesschatmaster.com/slack/spreadsheet-change-notification
こちらの記事を参考に、D列の情報をもとに別シートにQuery関数で抜き出すことでできるのではないかなど色々試したもののうまくいかず(Query関数だとシートの編集扱いにならなかった)、こちらでご教示頂こうと思い、登録しました。

足りない情報あれば追記いたしますので、お手数お掛け致しますが、何卒よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/04/30 12:11

「契約が完了する度に、A列からF列まで下記の情報が自動で入ります」とのことですが、どのようなツールによって自動入力されるのでしょうか。(Googleフォームでしょうか?それともスプレッドシートのスクリプトでしょうか?)
satoru.c

2022/04/30 12:18

ご返信ありがとうございます zapierというツールで入力します https://zapier.com/ zapierからSlackに直接飛ばすと商品での場合分けができないので、スプレッドシートを一度挟んでいるという状況です
guest

回答1

0

ベストアンサー

Zapierなどの外部ツールによってスプレッドシートに自動入力されるような場合、入力された箇所を特定することは困難です。

・onChange(変更時)をトリガーにすることは可能ですが、入力された箇所を特定することができません。 
(質問文の記事は、ユーザーが手で入力を行った場合が想定されており、このような場合はgetActiveRange()で入力箇所を推定できます。Zapier等による自動入力は手入力ではないため、この方法が使えません。)
・自動入力されてすぐに発火するわけではなく、ランダムな間隔で発火されます。
・onEdit(編集時)トリガーは、自動入力の場合発火しません。

代替案

GASでWebアプリを作り、
契約完了時Zapierがスプレッドシートへデータ入力する際に、同時にZapierからGASへ商品名を通知、
GAS側でその商品名に応じてメッセージを組み立て、slackへ投げる、というやり方はできるかもしれません。


【GAS側】

①エディタで下記のコードを入力して、保存します。

js

1function doGet(e) { 2 const itemName = e.parameter.itemname; 3 let message = ''; 4 if (itemName === '商品A') { 5 message = '商品Aが入力されました'; 6 } else if (itemName === '商品B') { 7 message = '商品Bが入力されました'; 8 } 9 /*-- 以下Slackへの投稿部分 --*/ 10 const data = { 11 username : 'ユーザ名', 12 text : message 13 }; 14 const payload = JSON.stringify(data); 15 16 const options = { 17 method : 'post', 18 contentType : 'application/json', 19 payload : payload 20 }; 21 22 // Slackに投稿 (実際のSlack投稿用Incoming webhook URLに置き換えてください) 23 UrlFetchApp.fetch("https://hooks.slack.com/services/**/**/**", options); 24 25 /*-- 以上Slackへの投稿部分ここまで --*/ 26 27 return toJson("OK"); 28} 29 30function toJson(content) { 31 const output = ContentService.createTextOutput(); 32 output.setMimeType(ContentService.MimeType.JSON); 33 output.setContent(JSON.stringify(content)); 34 return output; 35} 36

②Webアプリとしてデプロイします。
このとき、「次のユーザーとして実行」を自分、 「アクセスできるユーザー」を「全員」 に指定する必要があります。
(そうしないとZapierがGASにアクセスできません)
イメージ説明

このとき発行されたデプロイURLをコピーしておきます。

③ 注意:GASの内容を修正する度、保存してデプロイを行う必要があります。デプロイする度にデプロイURLも変わるのでZapierで設定し直す必要があります。
Zapier側に設定したデプロイURLを毎回修正したくない場合は、「GAS デプロイURLの固定」でやり方を検索してください。
なお、テストデプロイで発行されるURL(末尾dev)は、Zapierがアクセスできないので使えません。


 

【Zapier側】

1.「Edit Zapier」画面を開いて、現状のZAPを編集します。
フローを追加するため、最後のアクションの下にある「+」記号をクリックします。
イメージ説明

2.Actionから、「Webhooks by Zapier」を選択します。
イメージ説明

3.Action Eventから「GET」を選択します。
イメージ説明


4. 「URL」に、先ほどコピーしたGASのデプロイURLを入力。( https:// から ~exec まで)
「Query string params」の左側boxに「itemname」、右側boxにGASに渡したいデータを指定します。
※下の画像で右側boxに入力しているのは例に過ぎません。
実際には、Zapierの前のActionでスプレッドシートに自動入力しているデータと同じもの(契約時の商品名?)を指定してください。
イメージ説明


5.「Continue」をクリックし、TEST をクリックします。TESTが完了すればCloseを押して終了です。

 

投稿2022/04/30 12:48

編集2022/05/02 06:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

satoru.c

2022/04/30 12:59

丁寧に解説までありがとうございます。なんとか編集扱いにできないかと四苦八苦していましたが、そもそも無理というかたちなのですね。 一度別の方法を模索してみます。ご丁寧にありがとうございました。
satoru.c

2022/05/01 09:44

qnoir様 返信が遅れてしまい、申し訳ございません。 下記内容が理解できていないのですが、ご教示いただけますでしょうか。 >Zapier側: Zapierから、GASのデプロイURLに商品名(itemname)をパラメータに設定してリクエスト GAS画面でWebアプリとしてデプロイして、 https://script.google.com/macros***のURLを取得するところまではわかったのですが、それをどこに使用するのかわからずという状況です。 お手数お掛けしますが、よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2022/05/02 02:22 編集

・Zapier側の設定を追記しました。 ・GASのコードを一部修正しました。またデプロイ時の注意点についても記載しています。
satoru.c

2022/05/02 06:05

qnoir様 追記ありがとうございます。 パラパラと申し訳ございません、①のGAS側への入力をした際に、下記エラーが出てしまいます。 >構文エラー: SyntaxError: Unexpected token 'return' 行: 27 ファイル:( return toJson("OK");の行になります。) お忙しいところお手数お掛けしますが、よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2022/05/02 06:23

説明不足ですみません。 その前の // Slackに投稿 UrlFetchApp.fetch(webhook URL, options); のところの webhook URL は、実際のSlack投稿用Incoming webhook URLに置き換えてください。 例: UrlFetchApp.fetch("https://hooks.slack.com/services/**/**/***", options);
satoru.c

2022/05/02 07:46

qnoir様 追記ありがとうございます。大変申し訳ございません、ダブルクォーテーションが抜けておりました。 またまた追加の要望で大変恐縮なのですが、スプレッドシートに入力された会社名などもSlackに通知することは可能でしょうか。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2022/05/02 07:58 編集

ZapierからGASにデータを送る設定(回答の4.)で、Query string paramsを複数指定することが可能です。 したがって、商品名以外に会社名等も通知することは可能だと思います。 (回答の4.の画像の、右側にある「×」の下の「+」ボタンをクリックすると、Query string paramsを行追加できます) 現状、Zapierで itemname というparamsを設定していますが、「+」ボタンで行追加して 左boxに 「company」 と入力、右側には、会社名を示すアイテムを指定します。 GASの方は、「e.parameter.company」 という変数で、Zapierから送信された会社名にアクセスできます。 (GAS側のコードを修正した場合は、上書き保存して再デプロイし、ZapierのURLを設定し直すことを忘れないでください)
satoru.c

2022/05/02 09:30

qnoir様 回答ありがとうございます。増やすことができました。 以上で実装したいことは全て完了しました。 この度はご対応いただき、本当にありがとうございました。 困っていたので本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問