Обработка массива данных и отправка его через Gmail

В записи по функции Googlefinance я создал таблицу со списком интересующих акций.
Теперь пора приступить к написанию скрипта, который будет брать акции стоимостью ниже 70% к максимальной годовой стоимости и высылать их список на почту.

МиниТЗ

  1. Обработать сток;
  2. Отсеять акции, которые не нужны к рассылке, т.е. те, что были проанализированы ранее, как с признаком «Нет»;
  3. Выбрать акции ниже порогового значения 70%;
  4. Выслать их список на почту;
  5. Допущение: так как биржа в выходные не работает, получать список требуется только в рабочие дни.

Рабочие дни только

И начнём с конца, то есть с проверки «Рабочий или выходной день»:

function workingDay() { // объявляем функцию
const currentDate = new Date(); //получаем текущую дату
const currentDay = currentDate.getDay(); // получаем текущий день в числовом (int) виде
const dayStart = 0; // воскресенье
const dayFinish = 6; // суббота
if(currentDay > dayStart && currentDay < dayFinish) { // если сегодня больше воскресенья и меньше субботы
sendStockByEmail(); // выполняем функцию sendStockByEmail
}

Детали

Метод getDay() возвращает порядковый номер дня недели указанной даты по местному времени, где 0 соответствует воскресенью. 6 соответствует субботе. Всё, что больше 0 и меньше 6 — рабочие дни.

Именно в рабочие дни будет происходить запуск функции sendStockByEmail();

Выбор и отправка стока

function sendStockByEmail(){
const email = 'yourEmail@gmail.com'; //объявляем емейл куда будем высылать необходимые данные
const check = 'Нет'; // тот самый "нет" как признак не интересующих позиций
const edge = 0.7; // отсечка "все что ниже 70%" по стоимости акции к максимуму
// обращаемся к листу с перечнем акций
const ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Stock');
// получаем массив со всем стоком
const allStock = ss.getRange(2, 1, ss.getLastRow(), 10).getValues();
//создаем массив по фильтру edge и check
const filteredStock = allStock.filter(row => row[6] < edge && row[9] !== check)
//итерируем новый массив с необходимыми полями после фильтрации
.map(row => { return [row[0], row[1],' | ', row[2],' | ' ,(row[6]*100).toFixed(2) + '%',' | ', (row[7]*100).toFixed(2) + '%']});
// удаляем последний пустой элемент массива
filteredStock.pop();
//превращаем массив в текст
const filteredStockText = filteredStock.join('\r\n');
//отправляем filteredStockText текст в почту
GmailApp.sendEmail(email, 'Potential stock to buy', filteredStockText);
}

Детали

getRange(2, 1, ss.getLastRow(), 10).getValues();

getRange возвращает диапазон с верхней левой ячейкой в ​​заданных координатах с заданным количеством строк и столбцов.

То есть со второй строки (так как шапка не нужна), первого столбца до последней заполненной строки и 10го по счету столбца в массив получаются значения.

! важно! getValues() возвращает массив в отличие от getValue()

const filteredStock = allStock.filter(row => row[6] < edge && row[9] !== check)

Метод filter() создаёт новый массив со всеми элементами, прошедшими проверку, задаваемую в передаваемой функции.

В столбцах 7 и 10 как раз находятся показатели по % и «Нет» соответственно.

Так как массив начинается с нулевого (0) элемента — происходит уменьшение на 1, столбец 7 это элемент 6 массива, столбец 10 — элемент 9 соответственно.

.map(row => { return [row[0], row[1],' | ', row[2],' | ' ,(row[6]*100).toFixed(2) + '%',' | ', (row[7]*100).toFixed(2) + '%']});

Метод map() создаёт новый массив с результатом вызова указанной функции для каждого элемента массива.

Метод toFixed() форматирует число, используя запись с фиксированной запятой. Иными словами мы получаем значение с 2 знаками после запятой к которому затем подставляется знак «%».

const filteredStockText = filteredStock.join('\r\n');

Тут все просто. Метод join() объединяет все элементы массива в строку. А \r\n нужно для того, чтоб каждый элемент при объединении уходил на новую строку.

Что дальше?

А дальше — вешаем функцию workingDay на триггер по срабатыванию раз в день с 10 до 11 часов (то есть тогда, когда биржа открывается).

Результат:

Каждое утро рабочего дня в почте письмо следующего содержания:

Aeroflot-Rossiyskiye Avialinii PAO,MCX:AFLT, | ,69.86, | ,65.95%, | ,66.31%

American Airlines Group Inc,AAL, | ,17.01, | ,55.26%, | ,54.26%

Boeing Co,BA, | ,229.5, | ,65.58%, | ,65.34%

Delta Air Lines, Inc.,DAL, | ,41.85, | ,66.98%, | ,65.12%

Irkutskenergo PAO,IRGZ, | ,11.8, | ,69.41%, | ,67.06%

Mostotrest PAO,MSTT, | ,105.6, | ,48.21%, | ,48.80%

NP korporatsiya Irkut PAO,IRKT, | ,25.08, | ,53.59%, | ,53.59%

Rusgrain Holding PAO,MCX:RUGR, | ,8.89, | ,66.10%, | ,65.65%

Surgutneftegaz PAO,SNGS, | ,35.28, | ,63.16%, | ,62.94%

Добавить комментарий