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

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

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

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Q&A

解決済

1回答

742閲覧

GASでADパスワードの有効期限が近付いてきた従業員にslackのDMで通知をしたい。

kaguramiyabi

総合スコア13

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

0グッド

1クリップ

投稿2021/06/23 06:21

編集2021/06/24 05:41

先日同様のタイトルで質問させていただいたのですがパスワードの有効期限が14日以下のユーザーの抽出まではうまくいったのですが、slackのDMで通知をする際、14日以下のユーザー情報がすべてDMの内容に記載されてしまいます。
これを14日以下になっている該当のユーザーに自分の情報のみを通知させたいと考えています。

プログラム自体素人の為、まったくいい方法が分からず困っています。

現在は以下のように作成しています。

GAS

1function alertContract() { 2 var mySheet = SpreadsheetApp.openById('○○○○').getSheetByName('××××'); //スプレッドシートを取得 3 var lastRow = mySheet.getLastRow(); //スプレッドシートの最終行を取得 4 var today = new Date(); //今日の日付を取得 5 6 7 /* 契約見直日まで14日切っていたらSlack投稿 */ 8 for (var i = 2; i <= lastRow; i++) { 9 var Di = mySheet.getRange(i, 1).getValue(); //ユーザー名を取得 10 var days = mySheet.getRange(i, 4).getValue(); //期限切れ日数を取得 11 var dateHi = new Date(mySheet.getRange(i, 2).getValue()); //有効期限を取得 12 if (days <= 14) { //2週間前に告知 13 14 var strText = "ADアカウントのパスワード期限が迫っています。パスワードの変更をお願いします。" + Di + " " + "有効期限切れまで" + days + "日前" + "\nhttps://docs.google.com/document/d/1P7L_" 15 16 postDM(strText); 17 } 18 } 19} 20 21 22const slack_app_token = "xoxb-△△△△"; 23 24//botからDMを送る 25function postDM(strText){ 26 var mySheet = SpreadsheetApp.openById('○○○○').getSheetByName('××××'); //スプレッドシートを取得 27 var lastRow = mySheet.getLastRow(); //スプレッドシートの最終行を取得 28 29 var message = strText 30 //【処理1】DMを開き、チャンネルIDを取得する 31 const member_id = mySheet.getRange(28,5 ).getValue(); //メンバーIDを指定 32 const channel_id = getChannelID_(member_id); 33 34 //【処理2】指定の[チャンネルID]にDMを送信する 35 const message_options = { 36 "method" : "post", 37 "contentType": "application/x-www-form-urlencoded", 38 "payload" : { 39 "token": slack_app_token, 40 "channel": channel_id, 41 "text": message 42 } 43 }; 44 45 //必要scope = chat:write 46 const message_url = 'https://slack.com/api/chat.postMessage'; 47 UrlFetchApp.fetch(message_url, message_options); 48 49} 50 51 52/** 53* メンバーIDを受け取りチャンネルIDを返す 54* 55* @param {string} メンバーID 56* @return {string} チャンネルID 57*/ 58function getChannelID_(member_id) { 59 60 const options = { 61 "method" : "post", 62 "contentType": "application/x-www-form-urlencoded", 63 "payload" : { 64 "token": slack_app_token, 65 "users": member_id 66 } 67 } 68 69 //必要scope = im:write 70 const url = 'https://slack.com/api/conversations.open'; 71 const response = UrlFetchApp.fetch(url, options); 72 73 const obj = JSON.parse(response); 74 console.log(obj); 75 76 return obj.channel.id; 77 78}

考えとしては条件に該当するユーザーのslackユーザーIDを取得してDMを送るようにすればいいのではないかと考えています。

どなたかご教授いただけませんでしょうか。
宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

postDM()にユーザーIDを渡すようにしたらだうまくいかないでしょうか。

diff

1function alertContract() { 2(略) 3 4 5 /* 契約見直日まで14日切っていたらSlack投稿 */ 6 for (var i = 2; i <= lastRow; i++) { 7 var Di = mySheet.getRange(i, 1).getValue(); //ユーザー名を取得 8 var days = mySheet.getRange(i, 4).getValue(); //期限切れ日数を取得 9 var dateHi = new Date(mySheet.getRange(i, 2).getValue()); //有効期限を取得 10+ var user_id = mySheet.getRange(i, 3).getValue(); //ユーザーIDを取得 11 if (days <= 14) { //2週間前に告知 12 13 var strText = "ADアカウントのパスワード期限が迫っています。パスワードの変更をお願いします。" + Di + " " + "有効期限切れまで" + days + "日前" + "\nhttps://docs.google.com/document/d/1P7L_evWv8tjBG854tBiu6dGFEW1H3xsbaNRIKlY2dWo/edit?usp=sharing" 14 15- postDM(strText); 16+ postDM(strText, user_id); 17 } 18 } 19} 20 21const slack_app_token = "xoxb-△△△△"; 22 23//botからDMを送る 24-function postDM(strText){ 25+function postDM(strText, user_id){ 26- var mySheet = SpreadsheetApp.openById('○○○○').getSheetByName('××××'); //スプレッドシートを取得 27- var lastRow = mySheet.getLastRow(); //スプレッドシートの最終行を取得 28 29 var message = strText 30 //【処理1】DMを開き、チャンネルIDを取得する 31- const member_id = mySheet.getRange(28,5 ).getValue(); //メンバーIDを指定 32- const channel_id = getChannelID_(member_id); 33+ const channel_id = getChannelID_(user_id); 34 35(以下略)

投稿2021/06/23 11:00

編集2021/06/23 11:01
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kaguramiyabi

2021/06/24 01:58

qnoir さん ご回答いただきありがとうございます。 ご教授いただきました内容に修正いたしましたところ「TypeError: Cannot read property 'id' of undefined」となってしまい動作しない状況です。 エラーとなっているコードはreturn obj.channel.id;となります。 お手数ですが引き続き宜しくお願い致します。
kaguramiyabi

2021/06/24 02:32 編集

qnoir さん回答を元とに下記コードを修正しましたがエラーは改善されませんでした。 変更前 function getChannelID_(member_id) { const options = { "method" : "post", "contentType": "application/x-www-form-urlencoded", "payload" : { "token": slack_app_token, "users": member_id } } //必要scope = im:write const url = 'https://slack.com/api/conversations.open'; const response = UrlFetchApp.fetch(url, options); const obj = JSON.parse(response); console.log(obj); return obj.channel.id; 変更後 function getChannelID_(channel_id) { const options = { "method" : "post", "contentType": "application/x-www-form-urlencoded", "payload" : { "token": slack_app_token, "users": channel_id } } //必要scope = im:write const url = 'https://slack.com/api/conversations.open'; const response = UrlFetchApp.fetch(url, options); const obj = JSON.parse(response); console.log(obj); return obj.channel.id;
kaguramiyabi

2021/06/24 03:55

試しにuser_idを自身のユーザーIDで直接指定して行ったところエラーは出ずにDMが届きましたがやはり有効期限が14日以下のユーザー情報がすべて掲載されてしまいます。
退会済みユーザー

退会済みユーザー

2021/06/24 13:15

質問文に記載のの修正前のコードで postDM()の最初の2行  var mySheet = SpreadsheetApp.openById('○○○○').getSheetByName('××××'); //スプレッドシートを取得 var lastRow = mySheet.getLastRow(); //スプレッドシートの最終行を取得 ここで「DM送付先のユーザーIDを取得している」と推察したのですが、違いますでしょうか? また、前回の質問に記載されていた画像から、スプレッドシートの3列目に各々のユーザーIDが記載されていると推察したのですが、違うのでしょうか? 考え方として、ユーザーごとにDM送付先のユーザーIDを切り替えればいいだけだと思いました。 修正前の質問のコードでは、1つのユーザーIDに対してすべてのデータを送付しているので「有効期限が14日以下のユーザー情報がすべて掲載されてしまう」という事態が発生しています。 修正後のコードは、ユーザーごとにユーザーIDを切り替えるつもりで書きました。 動作が正しくても。そもそもユーザーID(スプレッドシートの3列目に記載されているユーザーID)が誤っているか、無効であれば、エラーが発生します。
kaguramiyabi

2021/06/25 01:41

qnoirさん ご回答ありがとうございます。 var mySheet = SpreadsheetApp.openById('○○○○').getSheetByName('××××'); //スプレッドシートを取得 var lastRow = mySheet.getLastRow(); //スプレッドシートの最終行を取得 上記のコードではスプレッドシート内にユーザーIDを3行目に記載しているのでユーザーIDを取得させる為に記載していました。 3行目のユーザーIDは関数で該当ユーザーのユーザーIDを取得して表示させています。ただ、実際の3行目を指定してしまうと実際にDMで通知が行ってしまうので別途5行目に自身のユーザーIDのみ記載し、自身のADアカウントの有効期限を2週間以下に設定してご教授いただいたコードに修正してテストを行いましたが、エラーとなってしまい通知されませんでした。 『考え方として、ユーザーごとにDM送付先のユーザーIDを切り替えればいいだけだと思いました。 修正前の質問のコードでは、1つのユーザーIDに対してすべてのデータを送付しているので「有効期限が14日以下のユーザー情報がすべて掲載されてしまう」という事態が発生しています。』 とのことですが、現在はテストとして自身のみに通知を行っているのですがこれを対象者へ通知した場合は自分が想定する対象ユーザーのみのデータが表示されるのでしょうか。
kaguramiyabi

2021/06/25 07:50

本件について複数のユーザーにDMで通知する際は該当のユーザーのみの情報が表示されることを確認しました。確認方法としては対象となるデータをデータ列の最初に移動させコードを動かしたところDMが送られ自分のデータが記載されていました。 しかし、AD上にユーザーは存在していますが、使用していないユーザーもあるので使用していないユーザーのslackユーザーIDは空白となっています。昨日記載したエラーは空白となっていることでエラーになってしまっているのではないかと考えています。 ただ、5行目の空白内にaを打ってvar user_id = mySheet.getRange(i, 5).getValue();で指定し、実行しても自分のデータのところまでは届かずエラーとなってしまいます。
kaguramiyabi

2021/06/25 08:36

本件ですが、エラーの原因が判明いたしました。qnoirさんのおっしゃる通り『そもそもユーザーID(スプレッドシートの3列目に記載されているユーザーID)が誤っているか、無効であれば、エラーが発生します。』が原因でユーザーIDが空白または正しくない場合はエラーとなって動作が止まってしまうことを確認しました。その為、運用するときは3行目にはすべて正しいユーザーIDを取得して使用していないADアカウントに関してはif (days <= 14 && days >=-30)として14日以下・-30日以上のユーザーのみが対象となるように修正いたしました。ご協力いただきましてありがとうございました。
退会済みユーザー

退会済みユーザー

2021/06/25 08:38

時間がなく、すぐ対応できず申し訳ありませんでした。解決されたのであればよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問