В одной из прошлых записей я написал скрипт, позволяющий отслеживать стоимость акций ниже 70% от их максимума за год. Сегодня же напишем новый скрипт, присылающий на почту имена акций, падающих три дня подряд.
Для этого мне понадобятся гугл таблицы и, конечно, гугл скрипты.
Итак, создадим новый скрипт и добавим в него следующую функцию:
function getStockDown() {
const ss = SpreadsheetApp.getActiveSpreadsheet(); // текущая книга
const wsSource = ss.getSheetByName('StockData'); // лист со списком тикетов
const wsResult = ss.getSheetByName('Technical'); // лист с результатами работы формулы
const email = 'yourEmail@gmail.com';
// получили список всех тикетов
const stockList = wsSource.getRange(1,1,wsSource.getLastRow(),2).getValues(); const dataArr = []; // массив для заполнения данными по стоку
const checkOne, checkTwo, overallCheck // проверка изменений стоимости
Пока ничего нового да? обратились к текущей книге, листу со списком тикетов и… вот тут маленькая хитрость — к листу «Technical», где будут выполняться формулы GOOGLEFINANCE.

Вот здесь — const stockList = wsSource.getRange(1,1,wsSource.getLastRow(),2).getValues(); я получаю массив данных из первых двух столбцов, содержащих имя акции и ее код
// идем по всему массиву со стоком
for(let i = 1; i < stockList.length; i++){ let stCompany = stockList[i][0] // имя компании
let stName = stockList[i] [1]; // тикет
let stNameFormula ='IFERROR((GOOGLEFINANCE("' + stName + '"; "price"; TODAY()-365*6/365; TODAY()));0)'; // формула с ценами закрытия за 3 дня по тикету
wsResult.getRange(1,1).setValue(stName); // установили тикет
wsResult.getRange(1,2).setFormula(stNameFormula); // сделали от него формулу
prelimArr = wsResult.getDataRange().getValues(); // получили массив с результатами формулы по тикету

Порой, формула не успевает сработать или вообще показывает ошибку, для избежания этого вношу в скрипт проверку по длине массива, что все данные были получены:if(prelimArr.length > 3){ // если формула сработала корректно то
let secondElement = prelimArr[1][2]; // цена позапозавчера
let thirdElement = prelimArr[2][2]; // цена позавчера
let forthElement = prelimArr[3[2]; // цена вчера
checkOne = forthElement - thirdElement; // сегодня минус вчера
checkTwo = thirdElement - secondElement; // вчера минус позавчера
if(checkOne < 0 && checkTwo < 0) { // если они оба меньше нуля
overallCheck = 'ok' } else { overallCheck = 'no' }
// получаю массив со всеми "выжившими" тикетамипосле проверки
dataArr.push([stCompany, stName, secondElement, thirdElement, forthElement, overallCheck])
}
};
const finalArr = dataArr.filter(row => row[5] == 'ok') // массив тикетов с падающей ценой
const filteredStockText = finalArr.join('\r\n');
GmailApp.sendEmail(email, 'Stock falling within 3 days', filteredStockText); }
Ну а дальше — дело за малым, просто добавить его исполнение в ту же функцию по тригеру, что запускает ежедневную проверку:
function potentialStock() {
const currentDate = new Date();
const currentDay = currentDate.getDay();
const dayStart = 0;
const dayFinish = 6;
if(currentDay > dayStart && currentDay < dayFinish) {
sendStockByEmail();
getStockDown();
}
Всё. Теперь в рабочие дни мне на почту приходит 2 письма:
1. Список тикетов, цена которых ниже чем 0.7 от максимальной за год
2. Акции, падающие 3 последних дня подряд.