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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Gmail

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

Google Apps Script

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

1回答

631閲覧

GASでフォーム送信メールからデータを取得してスプレッドシートに蓄積したい

aki-taka

総合スコア6

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Gmail

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

Google Apps Script

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2019/10/28 09:50

前提・実現したいこと

GAS初心者(3日目ぐらいです・・・)です。
Gmailからメッセージを取得し、スプレッドシートへの追加を試みています。
何とか実現できたのですが、何度も同じメッセージが追加されることを防ぎたいので、
「メッセージIDを出力し、メッセージIDに重複がない場合のみ追記する」
ようにfunction hasId(id)を追加したのですがうまくいきません。

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

このソースでは、何度も同じメッセージが追加されてしまいます。
原因を教えて頂けると助かります!!!

該当のソースコード

var mySheet = SpreadsheetApp.getActive().getSheetByName('MAアラート');
var data = mySheet.getRange(2, 3, mySheet.getLastRow() - 1).getValues();

function myFunction_point() {
/* var sheet = SpreadsheetApp.getActiveSheet(); */
var sheet = SpreadsheetApp.getActive().getSheetByName('MAアラート');

var query = 'label:ma_アラート to:(decora@decora.jp)';
var threads = GmailApp.search(query, 0, 400);
var messages = GmailApp.getMessagesForThreads(threads);

var valMsgs = [];

for(var i=0; i < messages.length; i++) {
for(var j=0; j < messages[i].length; j++) {
var id = messages[i][j].getId();
if(!hasId(id)){
var body = messages[i][j].getPlainBody();
var date = messages[i][j].getDate();
var from = messages[i][j].getFrom();
var lastRow = sheet.getLastRow() + 1;
var mobile = sheet.getRange(lastRow, 12);
var phone = sheet.getRange(lastRow, 13);
sheet.appendRow([
date,
from,
id,
fetchData(body, '会社名:', '\r'),
fetchData(body, 'お名前(姓):', '\r'),
fetchData(body, 'お名前(名):', '\r'),
fetchData(body, 'メールアドレス:', '\r'),
fetchData(body, '者:', '\r'),
fetchData(body, '顧客主担当:', '\r'),
fetchData(body, '担当エリア:', '\r'),
fetchData(body, '達成ポイント:', '\r'),
]);
mobile.setNumberFormat('@');
mobile.setValue(fetchData(body, '携帯番号:', '\r'));
phone.setNumberFormat('@');
phone.setValue(fetchData(body, '電話番号:', '\r'));
}
}
}
}

function hasId(id) {
var hasId = data.some(function(array, i, data) {
return (array[0] === id);
});
return hasId;
}

function fetchData(str, pre, suf) {
var reg = new RegExp(pre + '.*?' + suf);
var data = str.match(reg)[0]
.replace(pre, '')
.replace(suf, '');
return data;
}

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

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

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

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

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

guest

回答1

0

直すならこうでしょうが、やめたほうがいいです。

javascript

1function hasId(id) { 2 Logger.log("hasId"); 3 Logger.log(id); 4 return data.some(function(array) { 5 Logger.log(array); 6 return (array[0] == id); 7 }); 8}

なぜかというと、この方法では、デコラティブシステム株式会社の代表アドレスに保存されるアラートメールが400件を超えると新規のメールを拾えなくなるからです。
仮に400をもっと増やしても、上限があることにかわりはないです。いつかその壁にあたります。
またあまりに多くなると、1回の実行時間が長くなりすぎるという問題も出ます。ドメインがオリジナルであることからすれば、おそらくG Suite契約があると思うので、実行時間はあまり気にしなくてもいいのかもしれません。

こういう場合は、安直には検索条件に日付を入れて前回作業日から今日までのような検索にしたり、大幅に手入れするなら読み出したメールを既読にするとかラベルを付けるとかしてデータ的に識別できるようにして、それを検索条件に組み込むという対処をするといいのではないかと思います。

投稿2019/10/28 15:00

編集2019/10/29 14:16
papinianus

総合スコア12705

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

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

aki-taka

2019/10/29 03:35

ご教授ありがとうございます。 早速スクリプトを変更してみましたがやはり何度も転記されてしまいます。。。
papinianus

2019/10/29 14:17

0であってました。 となるとdataがとれてるかの問題になるので、回答で変更したようなロギングを入れて、ちゃんと既存データが取れているか見てください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問