使えるコード
だめなコード例
理由はソースコードに空白や欲しい情報以外にコードが入ってします。なので下記のextractUsingRegex
関数:を追加すると不要なコードを削除してくれる
追記9/29がスペースも除去してる
gmailの設定方法
設定のすべての設定を選択してフィルタのところで設定
追記9・29
改行と整理完璧
改行がうまくいかなかったら何か記号をつけての後に/n
を入れるとうまくいく
var lineToken = " "; // LINE Notifyのトークン
function send_line(Me) {
var payload = { 'message': Me };
var options = {
"method": "post",
"payload": payload,
"headers": { "Authorization": "Bearer " + lineToken }
};
UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}
function fetchContactMail() {
var ISREAD_LABEL = GmailApp.getUserLabelByName('通知済み');
var strTerms = ('label:通知対象 -label:通知済み');
var myThreads = GmailApp.search(strTerms);
var myMsgs = GmailApp.getMessagesForThreads(myThreads);
for (var i = 0; i < myMsgs.length; i++) {
var msg = myMsgs[i].slice(-1)[0];
if (!msg) continue; // メッセージが空の場合を回避
var body = msg.getPlainBody();
// URLを検索
var urlMatch = body.match(/https:\/\/assist[^\s]*/);
if (urlMatch) {
var url = urlMatch[0];
try {
// URLのコンテンツを取得
var response = UrlFetchApp.fetch(url);
var html = response.getContentText();
// <tr>内の<th>と<td>のペアを抽出し、電話番号や依頼内容も含める
var items = [];
var trMatch = html.match(/<tr>\s*<th>(.*?)<\/th>\s*<td>(.*?)<\/td>\s*<\/tr>/g);
if (trMatch) {
trMatch.forEach(function(row) {
var matches = row.match(/<th>(.*?)<\/th>\s*<td>(.*?)<\/td>/);
if (matches) {
var key = matches[1].trim();
var value = matches[2].replace(/<[^>]+>/g, '').trim(); // HTMLタグを除去してテキスト部分のみ取得
if (key === '電話番号' && value.includes('tel:')) {
// 電話番号は<a>タグ内にあるので特別処理
var phoneNumber = value.match(/tel:(\d+)/);
if (phoneNumber) {
value = phoneNumber[1];
}
}
items.push(key + ": " + value);
}
});
}
// 必要な項目をLINEに送信
if (items.length > 0) {
send_line("案件情報:\n" + items.join("\n"));
} else {
send_line("必要な項目が見つかりませんでした。");
}
} catch (e) {
send_line("URLの取得に失敗しました: " + e.message);
}
} else {
send_line("URLが見つかりませんでした。");
}
}
// メールを「通知済み」にラベル付け
myThreads.forEach(function (t) {
t.addLabel(ISREAD_LABEL);
});
}
function main() {
fetchContactMail();
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
var lineToken = " "; // LINE Notifyのトークン
// LINEにメッセージを送信する関数
function sendToLine(message) {
var options = {
"method": "post",
"headers": { "Authorization": "Bearer " + lineToken },
"payload": { "message": message }
};
UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options);
}
// 正規表現を使ってHTMLからデータを抽出する関数
function extractUsingRegex(html, regex) {
var match = html.match(regex);
return match ? match[1].replace(/ /g, ' ').replace(/>/g, '>').replace(/<[^>]+>/g, '').trim() : 'データなし';
}
// 案件情報を抽出し、LINEに送信する関数
function extractData(html) {
// 正規表現で案件情報を抽出
var 案件番号 = extractUsingRegex(html, /案件番号<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var 屋号 = extractUsingRegex(html, /屋号<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var お名前 = extractUsingRegex(html, /お名前<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var 電話番号 = extractUsingRegex(html, /電話番号<\/th>\s*<td>\s*<a.*?>\s*(.*?)\s*<\/a>/s);
var 住所 = extractUsingRegex(html, /住所<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var email = extractUsingRegex(html, /Email<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var 依頼日時 = extractUsingRegex(html, /依頼日時<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var 依頼内容 = extractUsingRegex(html, /依頼内容<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
// LINE通知の内容
var message = `
案件番号: ${案件番号}
屋号: ${屋号}
お名前: ${お名前}
電話番号: ${電話番号}
住所: ${住所}
Email: ${email}
依頼日時: ${依頼日時}
依頼内容: ${依頼内容}
`;
sendToLine(message); // LINE通知の関数呼び出し
}
function fetchContactMail() {
var ISREAD_LABEL = GmailApp.getUserLabelByName('通知済み');
var strTerms = ('label:通知対象 -label:通知済み');
var myThreads = GmailApp.search(strTerms);
var myMsgs = GmailApp.getMessagesForThreads(myThreads);
for (var i = 0; i < myMsgs.length; i++) {
var msg = myMsgs[i].slice(-1)[0];
if (!msg) continue; // メッセージが空の場合を回避
var body = msg.getPlainBody();
// URLを検索
var urlMatch = body.match(/https:\/\/assist[^\s]*/);
if (urlMatch) {
var url = urlMatch[0];
try {
// URLのコンテンツを取得
var response = UrlFetchApp.fetch(url);
var html = response.getContentText();
// 案件情報を抽出してLINEに送信
extractData(html);
} catch (e) {
sendToLine("URLの取得に失敗しました: " + e.message);
}
} else {
sendToLine("URLが見つかりませんでした。");
}
}
// メールを「通知済み」にラベル付け
myThreads.forEach(function (t) {
t.addLabel(ISREAD_LABEL);
});
}
function main() {
fetchContactMail();
}
追記9/29
var lineToken = " "; // LINE Notifyのトークン
// LINEにメッセージを送信する関数
function sendToLine(message) {
var options = {
"method": "post",
"headers": { "Authorization": "Bearer " + lineToken },
"payload": { "message": message }
};
}
// 正規表現を使ってHTMLからデータを抽出する関数
function extractUsingRegex(html, regex) {
var match = html.match(regex);
return match ? match[1].replace(/ /g, ' ').replace(/>/g, '>').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim() : 'データなし';
}
// 案件情報を抽出し、LINEに送信する関数
function extractData(html) {
var 案件番号 = extractUsingRegex(html, /案件番号<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var 屋号 = extractUsingRegex(html, /屋号<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var お名前 = extractUsingRegex(html, /お名前<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var 電話番号 = extractUsingRegex(html, /電話番号<\/th>\s*<td>\s*<a.*?>\s*(.*?)\s*<\/a>/s);
var 住所 = extractUsingRegex(html, /住所<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var email = extractUsingRegex(html, /Email<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var 依頼日時 = extractUsingRegex(html, /依頼日時<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var 依頼内容 = extractUsingRegex(html, /依頼内容<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
// LINE通知の内容(無駄なスペースを取り除く)
var message = [
`案件番号: ${案件番号}`,
`屋号: ${屋号}`,
`お名前: ${お名前}`,
`電話番号: ${電話番号}`,
`住所: ${住所}`,
`Email: ${email}`,
`依頼日時: ${依頼日時}`,
`依頼内容: ${依頼内容.replace(/\s+/g, ' ').trim()}` // 特に依頼内容の余計なスペースを削除
].map(line => line.trim()).join("\n");
sendToLine(message); // LINE通知の関数呼び出し
}
function fetchContactMail() {
var ISREAD_LABEL = GmailApp.getUserLabelByName('通知済み');
var strTerms = ('label:通知対象 -label:通知済み');
var myThreads = GmailApp.search(strTerms);
var myMsgs = GmailApp.getMessagesForThreads(myThreads);
for (var i = 0; i < myMsgs.length; i++) {
var msg = myMsgs[i].slice(-1)[0];
if (!msg) continue; // メッセージが空の場合を回避
var body = msg.getPlainBody();
// URLを検索
var urlMatch = body.match(/https:\/\/assist[^\s]*/);
if (urlMatch) {
var url = urlMatch[0];
try {
// URLのコンテンツを取得
var response = UrlFetchApp.fetch(url);
var html = response.getContentText();
// 案件情報を抽出してLINEに送信
extractData(html);
} catch (e) {
sendToLine("URLの取得に失敗しました: " + e.message);
}
} else {
sendToLine("URLが見つかりませんでした。");
}
}
// メールを「通知済み」にラベル付け
myThreads.forEach(function (t) {
t.addLabel(ISREAD_LABEL);
});
}
function main() {
fetchContactMail();
}
追記9・29
var lineToken = "dwTIX9rNyiHReGKMuJc9XpBkEJu5SVia6YigmDCQKos"; // LINE Notifyのトークン
// LINEにメッセージを送信する関数
function sendToLine(message) {
var options = {
"method": "post",
"headers": { "Authorization": "Bearer " + lineToken },
"payload": { "message": message }
};
}
// 正規表現を使ってHTMLからデータを抽出する関数
function extractUsingRegex(html, regex) {
var match = html.match(regex);
return match ? match[1].replace(/ /g, ' ').replace(/>/g, '>').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim() : 'データなし';
}
// 依頼内容を見やすく整形する関数
function formatRequestContent(content) {
return content
.replace(/\s+/g, ' ') // 余計なスペースを削除
.replace(/\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\]/g, '\n[$1]') // 日時部分を改行
.replace(/(01_建物種別は?:)/, '\n$1') // 「建物種別」の前に改行
.replace(/(99_その他ご依頼内容:)/, '\n$1') // 「その他ご依頼内容」の前に改行
.replace(/。/g, '。\n') // 句点で改行
.replace(/kana:/, '\nkana:'); // kanaの前で改行
}
// 案件情報を抽出し、LINEに送信する関数
function extractData(html) {
var 案件番号 = extractUsingRegex(html, /案件番号<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var 屋号 = extractUsingRegex(html, /屋号<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var お名前 = extractUsingRegex(html, /お名前<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var 電話番号 = extractUsingRegex(html, /電話番号<\/th>\s*<td>\s*<a.*?>\s*(.*?)\s*<\/a>/s);
var 住所 = extractUsingRegex(html, /住所<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var email = extractUsingRegex(html, /Email<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var 依頼日時 = extractUsingRegex(html, /依頼日時<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
var 依頼内容 = extractUsingRegex(html, /依頼内容<\/th>\s*<td>\s*(.*?)\s*<\/td>/s);
// 依頼内容を整形
依頼内容 = formatRequestContent(依頼内容);
// LINE通知の内容(各項目の先頭に■を追加し、案件番号の前に改行を追加)
var message = [
`₋\n■案件番号:${案件番号}`,
`■屋号:${屋号}`,
`■お名前:${お名前}`,
`■電話番号:${電話番号}`,
`■住所:${住所}`,
`■Email: ${email}`,
`■依頼日時:${依頼日時}`,
`■依頼内容:${依頼内容}`
].map(line => line.trim()).join("\n");
sendToLine(message); // LINE通知の関数呼び出し
}
function fetchContactMail() {
var ISREAD_LABEL = GmailApp.getUserLabelByName('通知済み');
var strTerms = ('label:通知対象 -label:通知済み');
var myThreads = GmailApp.search(strTerms);
var myMsgs = GmailApp.getMessagesForThreads(myThreads);
for (var i = 0; i < myMsgs.length; i++) {
var msg = myMsgs[i].slice(-1)[0];
if (!msg) continue; // メッセージが空の場合を回避
var body = msg.getPlainBody();
// URLを検索
var urlMatch = body.match(/https:\/\/assist[^\s]*/);
if (urlMatch) {
var url = urlMatch[0];
try {
// URLのコンテンツを取得
var response = UrlFetchApp.fetch(url);
var html = response.getContentText();
// 案件情報を抽出してLINEに送信
extractData(html);
} catch (e) {
sendToLine("URL取得失敗"); // エラーメッセージを簡潔に修正
}
} else {
sendToLine("URL無し");
}
}
// メールを「通知済み」にラベル付け
myThreads.forEach(function (t) {
t.addLabel(ISREAD_LABEL);
});
}
function main() {
fetchContactMail();
}