В записи по функции Googlefinance я создал таблицу со списком интересующих акций.
Теперь пора приступить к написанию скрипта, который будет брать акции стоимостью ниже 70% к максимальной годовой стоимости и высылать их список на почту.
МиниТЗ
- Обработать сток;
- Отсеять акции, которые не нужны к рассылке, т.е. те, что были проанализированы ранее, как с признаком «Нет»;
- Выбрать акции ниже порогового значения 70%;
- Выслать их список на почту;
- Допущение: так как биржа в выходные не работает, получать список требуется только в рабочие дни.
Рабочие дни только
И начнём с конца, то есть с проверки «Рабочий или выходной день»:
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%