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

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

詳細はこちら
Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

Slack

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

Q&A

解決済

1回答

1160閲覧

GAS 特定条件のレコードの代入と、その右隣の値も代入

dell_0

総合スコア25

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

Slack

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

0グッド

0クリップ

投稿2019/11/01 02:37

編集2019/11/11 08:00

改めて質問をさせていただきます。

スプレッドシート
A1「a@gmail.com」、B1「1111」
A2「b@gmail.com」、B2「2222」

というデータがあり、
GmailApp.searchで「a@gmail.com」からメールを受信した場合に、
「slackID」にB1の「1111」を代入するにはどうしたらよいでしょうか?

function run() {

var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();

var searchQuery = "a@gmail.com";
var dt = new Date();
dt.setMinutes(dt.getMinutes() - checkSpanMinute);

var threads = GmailApp.search(searchQuery);

var msgs = GmailApp.getMessagesForThreads(threads);
for(var i = 0; i < msgs.length; i++) {
var lastMsgDt = threads[i].getLastMessageDate();

if(lastMsgDt.getTime() < dt.getTime()) {
break;
}

for(var j = 0; j < msgs[i].length; j++) {
var To = msgs[i][j].getTo();
}

for (var i=0; i<data.length; i++){
var mail = data[i][0];

if(mail === To){
var slackID = mail.offset(0,1).getValue();

}
}

上記で配列に入れることはできたのですが、どのように改善すればよろしいかご教授いただけませんでしょうか。

宜しくお願いします。

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

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

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

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

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

macaron_xxx

2019/11/06 00:22

日本語って難しいですね。 実際に、来るメールのFrom, Toやスプレッドシートの内容などをダミー値で記してみて、どういった場合にどのチャンネルに配信されるのかを明確に記述したほうがよいと思いますよ。 抽象的なものほどわかりにくいものはないです。
dell_0

2019/11/11 06:52 編集

ご連絡ありがとうございます。 改めて質問をさせていただきます。 スプレッドシート A1「a@gmail.com」、B1「1111」 A2「b@gmail.com」、B2「2222」 というデータがあり、 GmailApp.searchで「a@gmail.com」からメールを受信した場合に、 「slackID」にB1の「1111」を代入するにはどうしたらよいでしょうか? function run() { var sheet = SpreadsheetApp.getActiveSheet(); var data = sheet.getDataRange().getValues(); var searchQuery = "a@gmail.com"; var dt = new Date(); dt.setMinutes(dt.getMinutes() - checkSpanMinute); var threads = GmailApp.search(searchQuery); var msgs = GmailApp.getMessagesForThreads(threads); for(var i = 0; i < msgs.length; i++) { var lastMsgDt = threads[i].getLastMessageDate(); if(lastMsgDt.getTime() < dt.getTime()) { break; } for(var j = 0; j < msgs[i].length; j++) { var To = msgs[i][j].getTo(); } for (var i=0; i<data.length; i++){ var mail = data[i][0]; if(mail === To){ var slackID = mail.offset(0,1).getValue(); } }
macaron_xxx

2019/11/11 07:02

質問は修正できるので、修正してください。
dell_0

2019/11/12 09:26

こちら自己解決出来ました。 function test() { var sheet = SpreadsheetApp.getActiveSheet(); var data = sheet.getDataRange().getValues(); for (var i=0; i<data.length; i++){ var mail = data[i][0]; var ID = data[i][1]; if(mail === 'メールアドレス'){ Logger.log(ID) } } } ご回答頂いた方々、誠にありがとうございました。
guest

回答1

0

ベストアンサー

やりたいことが、「シートのすべてのメールアドレスについて、検索と通知をしたい」だと思っています。
もしかしたら、探すべきtoは固定で単にその隣だけでいいのかもしれない。ただtoが固定でいいならidもハードコーディング(ベタ書き)できるのでそうじゃないだろうな、という推測

javascript

1function q220630() { 2 SpreadsheetApp.getActiveSheet().getDataRange().getValues().forEach(function (e) { 3 findMailAndPost(e[0], e[1]) 4 }); 5} 6 7function findMailAndPost(mailAddress, channelId) { 8 const from = "some@example.com"; 9 const searchQuery = "form:" + from + " to:" + mailAddress; 10 const quarter = 15; 11 const now = new Date(); 12 const border = (new Date()).setMinutes(now.getMinutes() - quarter); 13 GmailApp.getMessagesForThreads(GmailApp.search(searchQuery).filter(function (th) { 14 return th.getLastMessageDate().getTime() >= border; 15 })).reduce(function (a, c) { 16 return a.concat(c.map(function(e) { return mailToString(e, from); })) 17 }, []).forEach(function (s) { 18 postSlack(channelId, s) 19 }); 20} 21 22function mailToString(m, from) { 23 return "メール通知\nFrom:" + from + "\nTo:" + mailAddress + "\n日付:" + Utilities.formatDate(m.getDate(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm') + "\n件名:" + m.getSubject() + "\n" + m.getPlainBody(); 24} 25 26function postSlack(id, message) { 27 const SLACK_WEBHOOK_URL = 'xxxxxxxxxxxxxxxx'; 28 const response = UrlFetchApp.fetch(SLACK_WEBHOOK_URL, { 29 method: 'post', 30 contentType: 'application/json', 31 payload: JSON.stringify({ 32 channel: id, 33 text: message, 34 link_names: 1, 35 }) 36 }); 37 //console.log("response:", response); 38 return response; 39}

投稿2019/11/01 13:17

編集2020/01/16 19:01
papinianus

総合スコア12705

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

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

dell_0

2019/11/05 02:21

お返事ありがとうございます。 ご連絡おくれてしまい、すみません。 大変申し訳ないのが、自分に読解力と応用力がないため、解決できませんでした。 12行目でgetTimeが見つからないとエラーがでて、只今勉強中です。 単純に定期的に自分のgmailをGmailApp.searchさせ、指定のFromからメールが来たら場合、スプレッドシートのA列(メールアドレスを記載)をみて、該当した場合、その該当したA列にあるメールアドレスの右隣のB列(slackメンバーIDを記載)の文字列を channel: '個人のslackメンバーID', '個人のslackメンバーID'の所に記載したいです。 宜しくお願いします。
papinianus

2019/11/05 15:11

やりたいことが理解できません。 質問者様のメールアドレスに対してある固定のfromから来たものだけを検索して、そのfromから来たらそのfromに対応するチャンネルに送信するという意味ですか? 冒頭にも書いているのですが、ホントにそれがしたいなら、その固定のfromに対応するchannelは固定なので質問コードの’個人のslackメンバーID’のところに固定値をかきこめばよいはずです。 私が推測しているやりたいであろうことは、to(今回のコメントで変動するのがfromだとわかりましたがささいな問題です)は、シートのA列を順繰りに検索して、都度対応するB列のチャンネルに送信するという処理です(つまりfromがA1のメールを検索してB1に送り、A2のメールを検索してB2に送り、を順に自動で行うこと)。 これは質問内容に関わるので質問を補正することを推奨します。 エラーは直しましたが。
dell_0

2019/11/11 06:35

ご回答ありがとうございます。 申し訳ありません、自分でもよくわかっていないので現状でして。。 今度はfromが定義されていないとエラーになってしまいました。
papinianus

2020/01/16 19:02

from が定義されていない問題に対処
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問