У меня настроены оповещения Google, и я получаю оповещения по электронной почте, которые выглядят следующим образом:
Я хотел бы проанализировать предупреждение и сохранить его на листе Google в формате: имя_предупреждения, дата_публикации, заголовок, источник новостей.
Не уверен, с чего начать любую помощь / руководство приветствуется Спасибо
Вы можете использовать gmail api с appscript, так как Приложение Gmail работает очень похоже на то, как работает gmail api.
Первое, что вы должны сделать, это создать поиск в веб-приложении gmail, который будет возвращать только сообщения, которые вы ищете, что-то вроде этого.
var threads = GmailApp.search('from:([email protected])');
for(var i=0; i<threads.length; i++)
{
messages = threads[i].getMessages();
for(var j=0; j<messages.length; j++)
{
var date = messages[j].getDate();
var body = messages[j].getPlainBody();
var start = body.indexOf('<table');
var end = body.indexOf('</table>');
}
}
}
}
}
Тело возвращается в формате html, поэтому вам придется немного почистить его, чтобы найти нужный текст. Как только вы найдете нужный текст, вы можете просто записать его на лист, используя Приложение для электронных таблиц
function WriteToSheet(date, value){
var sheet = SpreadsheetApp.getActiveSheet();
sheet.appendRow([date, value]);
}
Этот код взят из скрипта, который я использую для сканирования одного из моих собственных электронных писем на наличие текста.
Хотя я разделяю мнение, которое @Рубен высказал в комментариях, я думаю, что эта тема интересна и может помочь другим пользователям сохранять и управлять своими Оповещения Google.
Code.gs
/* Retrieve all news from googlealert source */
const threads = GmailApp.search('from:([email protected])')
/* Our sheet for save the news */
const sS = SpreadsheetApp.openById(SS_ID).getSheetByName('Google Alerts')
/* Control the already added answers */
let addedNews = []
try { addedNews = sS.getRange('A1:A' + sS.getLastRow()).getValues().flat() } catch (err) { }
function parseContent() {
const totalNews = []
/* Maybe add a control system for remove the threads already saved */
threads.forEach((th) => {
const msgs = th.getMessages()
msgs.forEach((msg) => {
/* Divide the content in new lines an parse the content */
const body = msg.getPlainBody().split('\n')
/* Extract the filter name eg === News - 2 new results for [python] === */
const filterName = body.slice(0, 1)[0].match(/\[(.*?)\]/)[1]
const date = msg.getDate()
/* Remove the unnecessary lines */
const cleanedBody = body.slice(1, -11)
/* Detect the news via empty new lines "\r" */
const newsIdxs = cleanedBody.reduce((pre, curr, idx) => {
curr === "\r" && pre.push(idx)
return pre
}, [])
newsIdxs.forEach((v, idx, arr) => {
if (idx == arr.length - 1) return
/* From one empty line to the nex */
const parsedNew = cleanedBody.slice(v + 1, arr[idx + 1])
/* Simply extracted from the first line */
const title = parsedNew[0].split('|')[0]
/* Last line and between <> */
const url = parsedNew[parsedNew.length - 1].match(/<(.*?)>/)[1]
/* Extracted from the URL rather than the title due variability */
const source = url.match(/url=https://(.*?)//)[1]
totalNews.push({ title, url, date, source, filterName })
})
})
})
totalNews.forEach((nw) => {
/* Hash the object for preventing adding already present */
const id = hashCode(Object.values(nw).toString())
if (addedNews.includes(id)) return
sS.appendRow([id, ...Object.values(nw)])
})
}
/* Extracted from here https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript */
const hashCode = s => s.split('').reduce((a, b) => { a = ((a << 5) - a) + b.charCodeAt(0); return a & a }, 0)
Results
Примечание 1: этот сценарий является приближенным к проблеме и был протестирован только для предупреждений, связанных с новостями.
Заметка 2: Спасибо @ДалмТо за псевдокод, он помог мне быстрее подойти к проблеме.
Заметка 3: функция hashCode
извлечена из здесь.
Примечание 4: Я решил использовать подход с использованием регулярное выражение из-за использования getPlainBody()
, но я думаю, что в этом случае будет проще реализовать использование библиотеки, позволяющей анализировать HTML с помощью getBody()
.
Если вы хотите сохранить данные в Google Таблицах, начните с чтения Developers.google.com/apps-script/guides/sheets, а затем потратьте некоторое время на изучение основ службы Gmail (GmailApp), то есть на чтение ответа DaImTo.