Використовуйте Google Таблиці, щоб надіслати електронний лист на основі значення клітинки

Щоб надіслати електронний лист із Google Таблиць, потрібно використовувати сценарій Google Apps. Але не хвилюйтеся, якщо ви ніколи раніше не створювали жодного сценарію Google Apps, надіслати електронний лист дуже просто.

У наступному посібнику ви дізнаєтеся, як перевірити значення клітинки в Google Таблицях . Якщо значення перевищує певний пороговий ліміт, ви можете автоматично надіслати сповіщення електронною поштою на будь-яку адресу електронної пошти.

Існує багато застосувань для цього сценарію. Ви можете отримати сповіщення, якщо щоденні прибутки у вашому звіті про продажі опустяться нижче певного рівня. Або ви можете отримати електронний лист, якщо ваші співробітники повідомлять, що вони виставили клієнту рахунок за занадто багато годин у вашій електронній таблиці відстеження проекту.

Незалежно від програми, цей сценарій є переконливим. Це також заощадить ваш час від необхідності відстежувати оновлення електронної таблиці вручну.

Крок 1. Надсилання електронного листа за допомогою Google Таблиць

Перш ніж ви зможете створити сценарій Google Apps для надсилання електронних листів із Google Таблиць , вам також знадобиться адреса електронної пошти Gmail, до якої матиме доступ сценарій Google Apps для надсилання ваших сповіщень.

Вам також потрібно буде створити нову електронну таблицю, яка містить адресу електронної пошти.

Просто додайте стовпці імені та електронної пошти та заповніть їх особою, якій ви хочете отримати сповіщення електронною поштою.

Використовуйте Google Таблиці, щоб надіслати електронний лист на основі значення клітинки

Тепер, коли у вас є адреса електронної пошти, на яку ви можете надіслати сповіщення електронною поштою, настав час створити свій сценарій.

Щоб відкрити редактор сценаріїв, клацніть Інструменти , а потім виберіть Редактор сценаріїв .

Ви побачите вікно сценарію з функцією за замовчуванням під назвою  myFunction() . Перейменуйте це на SendEmail() .

Далі вставте наступний код у функцію SendEmail():

// Fetch the email address var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getRange("B2"); var emailAddress = emailRange.getValues(); // Send Alert Email. var message = 'This is your Alert email!'; // Second column var subject = 'Your Google Spreadsheet Alert'; MailApp.sendEmail(emailAddress, subject, message);

Ось як працює цей код:

  • getRange і getValues ​​витягують значення з клітинки, зазначеної в методі getRange.
  • змінне повідомлення та змінна тема визначають текст, який створюватиме ваше повідомлення електронної пошти.
  • Функція MailApp.sendEmail нарешті виконує функцію надсилання електронної пошти Google Scripts за допомогою підключеного облікового запису Google.

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

Майте на увазі, що Google Script потребує дозволу на доступ до вашого облікового запису Gmail , щоб надіслати електронний лист. Тож під час першого запуску сценарію ви можете побачити сповіщення, як показано нижче.

Використовуйте Google Таблиці, щоб надіслати електронний лист на основі значення клітинки

Натисніть «Переглянути дозволи» , і ви побачите ще один екран із сповіщенням, який потрібно буде пропустити.

Цей екран сповіщення з’явився тому, що ви пишете власний сценарій Google, який не зареєстровано як офіційний.

Використовуйте Google Таблиці, щоб надіслати електронний лист на основі значення клітинки

Просто натисніть «Додатково» , а потім натисніть посилання «Перейти до SendEmail (небезпечно)» .

Вам потрібно буде зробити це лише один раз. Ваш сценарій запуститься, і на адресу електронної пошти, яку ви вказали в електронній таблиці, надійде електронний лист, подібний до наведеного нижче.

Використовуйте Google Таблиці, щоб надіслати електронний лист на основі значення клітинки

Крок 2: читання значення з комірки в Google Таблицях

Тепер, коли ви успішно написали сценарій Google Apps, який може надсилати сповіщення електронною поштою, настав час зробити це сповіщення електронною поштою більш функціональним.

Наступним кроком, який ви дізнаєтесь, є те, як зчитувати значення даних із електронної таблиці Google, перевірити значення та видати спливаюче повідомлення, якщо це значення вище або нижче верхньої межі.

Перш ніж ви зможете це зробити, вам потрібно буде створити інший аркуш у таблиці Google, з якою ви працюєте. Назвіть цей новий аркуш «Мій звіт».

Використовуйте Google Таблиці, щоб надіслати електронний лист на основі значення клітинки

Майте на увазі, що комірку D2 ви захочете перевірити та порівняти. Уявіть, що ви хочете щомісяця знати, чи ваші загальні продажі впали нижче 16 000 доларів.

Давайте створимо сценарій Google Apps, який це зробить.

Поверніться у вікно редактора сценаріїв, натиснувши «Інструменти» , а потім «Редактор сценаріїв» .

Якщо ви використо��уєте ту саму електронну таблицю, у вас все одно буде  функція SendEmail() . Виріжте цей код і вставте його в блокнот. Він вам знадобиться пізніше.

Вставте наступну функцію у вікно коду.

function CheckSales() { // Fetch the monthly sales var monthSalesRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MyReport").getRange("D2"); var monthSales = monthSalesRange.getValue(); var ui = SpreadsheetApp.getUi(); // Check totals sales if (monthSales < 16000){="" ui.alert('sales="" too="" low!');="" }="">

Як працює цей код:

  • Завантажте значення з клітинки D2 у змінну monthSales .
  • Оператор IF порівнює місячні продажі в клітинці D2 із 16 000 доларів США
  • Якщо значення перевищує 16 000, код викличе вікно повідомлення браузера з попередженням.

Збережіть цей код і запустіть його. Якщо він працює належним чином, ви повинні побачити наступне сповіщення у своєму браузері.

Використовуйте Google Таблиці, щоб надіслати електронний лист на основі значення клітинки

Тепер, коли у вас є сценарій Google Apps, який може надсилати сповіщення електронною поштою, і інший сценарій, який може порівнювати значення з електронної таблиці, ви готові об’єднати обидва й надіслати сповіщення замість ініціювання сповіщення.

Крок 3: Збираємо все разом

Тепер настав час об’єднати два сценарії, які ви створили, в один.

До цього моменту ви маєте мати електронну таблицю з вкладкою під назвою Sheet1, яка містить сповіщення одержувача електронної пошти. Інша вкладка під назвою MyReport містить усю інформацію про продажі.

Повернувшись до Редактора сценаріїв, настав час застосувати на практиці все, що ви навчилися.

Замініть увесь код у редакторі сценаріїв своїми двома функціями, відредагованими, як показано тут.

function CheckSales() { // Fetch the monthly sales var monthSalesRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MyReport").getRange("D2"); var monthSales = monthSalesRange.getValue(); // Check totals sales if (monthSales < 16000){="" fetch="" the="" email="" address="" var="" emailrange="SpreadsheetApp.getActiveSpreadsheet().getSheetByName(" sheet1").getrange("b2");"="" var="" emailaddress="emailRange.getValues();" send="" alert="" email.="" var="" message='This month your sales were ' +="" monthsales;="" second="" column="" var="" subject='Low Sales Alert' ;="" mailapp.sendemail(emailaddress,="" subject,="" message);="" }="">

Зверніть увагу на зміни тут.

У оператор IF вставте сценарій SendEmail у функцію CheckSales() у дужки оператора if.

По-друге, об’єднайте змінну monthSales у кінець повідомлення електронної пошти за допомогою символу + .

Єдине, що потрібно зробити, це щомісяця запускати функцію CheckSales().

Для цього в редакторі сценаріїв:

  1. Клацніть пункт меню «Редагувати» , а потім клацніть тригери поточного проекту .
  2. У нижній частині екрана натисніть створити новий тригер .
  3. Виберіть функцію CheckSales для запуску.
  4. Змініть вибір джерела події на керований часом .
  5. Змінити  Виберіть тип тригера на основі часу на Таймер місяця .

Натисніть «Зберегти» , щоб завершити тригер.

Використовуйте Google Таблиці, щоб надіслати електронний лист на основі значення клітинки

Щомісяця запускатиметься ваш новий сценарій і порівнюватиме загальну місячну суму продажів у клітинці D2 із 16 000 доларів США.

Якщо він менший, він надішле електронний лист зі сповіщенням про низькі місячні продажі.

Використовуйте Google Таблиці, щоб надіслати електронний лист на основі значення клітинки

Як бачите, Google Apps Scripts містить багато функцій у невеликому пакеті. Використовуючи лише кілька простих рядків коду, ви можете робити дуже дивовижні речі.

Якщо ви хочете ще поекспериментувати, спробуйте додати ліміт порівняння в 16 000 доларів США в іншу клітинку електронної таблиці, а потім прочитайте це у своєму сценарії, перш ніж робити порівняння. Таким чином, ви можете змінити ліміт, просто змінивши значення на аркуші.

Налаштувавши код і додавши нові кодові блоки, ви зможете створити на основі цих простих речей, які ви навчитеся, згодом створювати чудові сценарії Google.

Автоматизація процесу

Поки все добре, але наведений вище сценарій запускатиметься лише вручну, якщо ми не встановимо жодних тригерів. На щастя, Google зробив запущену автоматизацію простою для налаштування. Ось кроки. 

У редакторі Apps Script натисніть значок Тригери на бічній панелі ліворуч (він виглядає як маленький годинник).

Натисніть посилання створити новий тригерr або Додати тригер у нижньому правому куті сторінки тригерів.

У спадному меню Choose which function to run виберіть sendEmails< a i=4> функція.

У спадному меню Вибрати джерело події виберіть Керований часом.

У спадному меню Виберіть тип тригера на основі часу виберіть потрібну частоту (наприклад, Денний таймер для щоденних електронних листів, Тижневий таймер для щотижневих електронних листів тощо).

Якщо можливо, виберіть потрібний діапазон часу або день тижня.

Натисніть Зберегти , щоб створити тригер.

Після збереження натисніть кнопку Розгорнути у верхньому правому куті та дотримуйтеся вказівок, щоб позначити та визначити розгортання. Вам потрібно буде надати дозволи автоматизації на запуск, і те саме стосується самого сценарію.  

Що стосується даного тригера, оскільки в нашому прикладі йдеться про надсилання нагадувань про рахунки-фактури, ми припускаємо, що вони щомісяця, і доцільно надсилати їх кожного 1-го числа місяця між 13:00 та 14:00. Але, звісно, ​​ви можете змінити частоту та час залежно від ваших потреб. 

Як надіслати електронний лист із вкладенням

Щоб показати вам, як надсилати електронні листи з вкладеннями, ми повторно використаємо зразок аркуша з нагадуваннями про рахунки-фактури та оновимо фрагмент, щоб включити вкладення. Тепер ми починаємо з функції, а шаблон електронного листа з’являється пізніше в коді. sendEmailReminders

Слід підкреслити, що наведений нижче фрагмент отримує вкладення електронної пошти з папки Диска Google, де дуже важливо вказати ідентифікатор папки та дотримуватися наведеної угоди про найменування. Докладніше про це в розділі коду

function sendEmailReminders() { // Отримати активний аркуш var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // Отримання діапазону даних (за винятком рядка заголовка) var dataRange = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()); // Отримати значення з діапазону даних var data = dataRange.getValues(); // Переглядати рядки даних for (var i = 0; i < data.length; i++) { var row = data[i]; // Отримати значення з кожного стовпця var businessName = row[0]; var email = row[1]; var invoiceNumber = row[2]; var invoiceAmount = row[3]; var dueDate = row[4]; змінна тема = рядок[5]; // Тіло електронного листа var emailBody = "Шановний " + назва компанії + ",\n\n" + "Нагадуємо, що рахунок №" + номер рахунку + " за $" + Сума рахунку + " настає " + Термін виконання + ".\n" + "Будь ласка, знайдіть вкладений рахунок-фактуру.\n\n" + "Дякуємо за вашу швидку увагу до цього питання."; // Додайте відповідний рахунок-фактуру – вам потрібно вказати правильний ідентифікатор папки, де зберігаються ваші рахунки-фактури var invoiceFolderId = 'YOUR_FOLDER_ID_HERE'; var invoiceFolder = DriveApp.getFolderById(invoiceFolderId); var invoiceFiles = invoiceFolder.getFilesByName(номер рахунку + '.pdf'); // Припускаючи, що файли рахунків-фактур знаходяться у форматі PDF var invoiceFile; if (invoiceFiles.hasNext()) { invoiceFile = invoiceFiles.next(); } else { // Якщо файл рахунку-фактури не знайдено, ви можете пропустити цей рядок або зареєструвати помилку console.error("Файл рахунку-фактури не знайдено для номера рахунку-фактури: " + invoiceNumber); продовжити; } // Надіслати електронний лист із вкладенням MailApp.sendEmail({ to: email, subject: subject, body: emailBody, attachments: [invoiceFile] }); }}

Давайте розберемо код

1. Визначте функцію: sendEmailReminders

функція sendEmailReminders() {

Рядок оголошує функцію з назвою , яка міститиме код для надсилання нагадувань електронною поштою з вкладеннями.sendEmailReminders

2. Отримайте активний аркуш:

var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

Рядок отримує активний аркуш із поточного відкритого документа Google Таблиць.

3. Отримайте діапазон даних (за винятком рядка заголовка):

var dataRange = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn());

Цей рядок отримує діапазон даних на аркуші, за винятком рядка заголовка. Він починається з другого рядка (рядок 2) і першого стовпця (стовпець 1) і продовжується до останнього рядка і останнього стовпця аркуша.

Додаткова примітка. Коли ви створюєте власний аркуш, вам потрібно змінити щоб він відповідав вашому аркушу. dataRange

4. Отримайте значення з діапазону даних:

var data = dataRange.getValues();

Цей рядок отримує значення (вміст) із діапазону клітинок, визначеного на попередньому кроці.

5. Прокрутіть рядки даних:

for (var i = 0; i < data.length; i++) { var row = data[i];

Цей цикл повторює кожен рядок у масиві. Змінна представляє поточний рядок даних у кожній iteration.fordatarow

6. Отримайте значення з кожного стовпця:

var businessName = row[0]; var email = row[1]; var invoiceNumber = row[2]; var invoiceAmount = row[3]; var dueDate = row[4]; змінна тема = рядок[5];

Рядки вище витягають значення з кожного стовпця в поточному рядку даних. Пізніше кожне значення присвоюється змінній для зручного використання в сценарії. Наведені значення є власними для нашого зразка аркуша. 

7. Створіть тіло електронного листа:

var emailBody = "Шановний " + назва компанії + ",\n\n" + "Нагадуємо, що рахунок №" + номер рахунку + " за $" + Сума рахунку + " настає " + Термін виконання + ".\n" + "Будь ласка, знайдіть вкладений рахунок-фактуру.\n\n" + "Дякуємо за вашу швидку увагу до цього питання.";

Код створює тіло електронної пошти, використовуючи значення, отримані з аркуша. Тіло електронної пошти – це рядок, який містить назву підприємства, номер рахунку-фактури, суму рахунку-фактури та дату виконання.

8. Отримайте відповідний файл рахунка:

var invoiceFolderId = 'YOUR_FOLDER_ID_HERE'; var invoiceFolder = DriveApp.getFolderById(invoiceFolderId); var invoiceFiles = invoiceFolder.getFilesByName(номер рахунку + '.pdf'); var invoiceFile; if (invoiceFiles.hasNext()) { invoiceFile = invoiceFiles.next(); } else { console.error("Файл рахунку-фактури не знайдено для номера рахунку: " + номер рахунку-фактури); продовжити; }

Ці рядки отримують файл рахунку-фактури, пов’язаний із поточним рядком. 

По-перше, доступ до папки файлу рахунку-фактури здійснюється за допомогою її ідентифікатора папки. Обов’язково замініть на справжній ідентифікатор папки. YOUR_FOLDER_ID_ТУТ

Зауважте, що в нашому прикладі прийнято таке найменування, а фактичний рахунок-фактура має назву «123456.pdf». Якщо ваші вкладені файли мають інші назви, вам потрібно буде оновити форматування. (Номер рахунку + '.pdf')

Далі сценарій шукає файл із такою ж назвою, як і номер рахунку-фактури (припускається, що файл у форматі PDF). 

Якщо файл знайдено, він призначається змінній; інакше сценарій реєструє повідомлення про помилку та переходить до наступного row.invoiceFile

9. Надішліть електронний лист із вкладенням:

MailApp.sendEmail({ to: email, subject: subject, body: emailBody, attachments: [invoiceFile] });

Цей рядок надсилає тіло та вкладення електронної пошти, і ось результати, які ви повинні отримати. Крім того, усі кроки автоматизації застосовуються, як описано раніше, і має сенс зберегти щомісячний тригер, оскільки це стосується надсилання нагадувань про рахунок-фактуру. 

Надішліть електронний лист у форматі HTML за допомогою GSheets

Щоб надіслати електронний лист у форматі HTML, ви можете внести деякі досить прості зміни в описаний раніше сценарій. Ось: 

function sendEmailReminders() { // Отримати активний аркуш var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // Отримання діапазону даних (за винятком рядка заголовка) var dataRange = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()); // Отримати значення з діапазону даних var data = dataRange.getValues(); // Переглядати рядки даних for (var i = 0; i < data.length; i++) { var row = data[i]; // Отримати значення з кожного стовпця var businessName = row[0]; var email = row[1]; var invoiceNumber = row[2]; var invoiceAmount = row[3]; var dueDate = row[4]; змінна тема = рядок[5]; // Тіло електронної пошти HTML var emailBodyHtml = "<p>Шановний " + назва компанії + ",</p>" + "<p>Це нагадування, що рахунок №" + номер рахунку + " за $" + Сума рахунку + " настає " + Термін виконання + ".</p>" + "<p>Будь ласка, знайдіть вкладений рахунок-фактуру.</p>" + "<p>Дякуємо за вашу швидку увагу до цього питання.</p>"; // Додайте відповідний рахунок-фактуру – вам потрібно вказати правильний ідентифікатор папки, де зберігаються ваші рахунки-фактури var invoiceFolderId = 'YOUR_FOLDER_ID_HERE'; var invoiceFolder = DriveApp.getFolderById(invoiceFolderId); var invoiceFiles = invoiceFolder.getFilesByName(номер рахунку + '.pdf'); // Припускаючи, що файли рахунків-фактур знаходяться у форматі PDF var invoiceFile; if (invoiceFiles.hasNext()) { invoiceFile = invoiceFiles.next(); } else { // Якщо файл рахунку-фактури не знайдено, ви можете пропустити цей рядок або зареєструвати помилку console.error("Файл рахунку-фактури не знайдено для номера рахунку-фактури: " + invoiceNumber); продовжити; } // Надіслати електронний лист із вкладенням MailApp.sendEmail({ to: email, subject: subject, htmlBody: emailBodyHtml, attachments: [invoiceFile] }); }}

У цій версії звичайний текст замінено змінною, яка містить вміст у форматі HTML. emailBodyemailBodyHtml

Під час виклику функції властивість body також замінюється на властивість, яка надсилатиме електронний лист як електронний лист HTML.MailApp.sendEmail()htmlBody

Побічні примітки: 

Задля зручності ми використовуємо замість у сценарії. Будь-який варіант спрацює, хоча, безсумнівно, є більш читабельним. У будь-якому випадку ви можете переформатувати сценарій і замінити оператор конкатенації заповнювачами під час інтерполяції рядків. varconstconst${вираз}

Крім того, жоден зі сценаріїв не містить функцій, оскільки вони не потрібні для наших прикладів. Але, звісно, ​​за допомогою цих типів сценаріїв також можна додавати та навіть автоматизувати. bccbcc

Нарешті, ви можете оживити ситуацію, додавши спеціальні стилі CSS, перегляньте оновлену функцію нижче. var emailBodyHtml =

// Тіло електронної пошти HTML зі стилями CSS var emailBodyHtml = "<html><head><style>" + "тіло {font-family: Arial, sans-serif;}" + "p {font-size: 14px;}" + ".invoice-info {font-weight: bold; колір: #4a4a4a;}" + "</style></head><body>" + "<p>Шановний <span class='invoice-info'>" + назва компанії + "</span>,</p>" + "<p>Це нагадування, що рахунок-фактура #<span class='invoice-info'>" + номер рахунку + "</span> для $<span class='invoice-info'>" + Сума рахунку + "</span> термін погашення до <span class='invoice-info'>" + Термін виконання + "</span>.</p>" + "<p>Будь ласка, знайдіть вкладений рахунок-фактуру.</p>" + "<p>Дякуємо за вашу швидку увагу до цього питання.</p>" + "</body></html>";

Професійні поради: 

  • Будьте зручні з , деякі постачальники поштових скриньок можуть не підтримувати та відтворювати сильно стилізовані електронні листи належним чином або взагалі не підтримувати їх. <стиль>
  • Використовуйте тестування електронної пошти Mailtrap, щоб дізнатися, наскільки постачальники поштових скриньок підтримують ваші листи HTML. 
  • Ще раз наголошую: якщо вам потрібно надіслати багато, завжди найкраще використовувати правильний MTA замість функції. sendEmail
  • На цій ноті зверніть увагу на обмеження вашого облікового запису Gmail. Вони відрізняються для Google Workspace і/або вашого приватного облікового запису. 

Як надіслати тригерні електронні листи з Google Таблиць?

Коли клітинка досягає певного значення

Ми покажемо вам, як надіслати автоматичний електронний лист на основі значення клітинки. У нашому прикладі рахунок-фактура буде надіслано, коли клітинка Invoice Amount досягне «0», що вказує на те, що клієнт відмовився. 

Зазначене значення клітинки ініціює спеціальний електронний лист про відтік, щоб негайно зв’язатися з клієнтом. І знову кроки автоматизації залишаються незмінними, ви все ще можете використовувати щомісячний тригер для цих електронних листів. 

Майте на увазі, що сценарій той самий, що ми використовували для надсилання електронних листів HTML і вкладень. Але він має інший рівень функціональності для впровадження описаної умовної логіки. Ось код. 

function sendEmailReminders() { // Отримати активний аркуш var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // Отримання діапазону даних (за винятком рядка заголовка) var dataRange = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()); // Отримати значення з діапазону даних var data = dataRange.getValues(); // Переглядати рядки даних for (var i = 0; i < data.length; i++) { var row = data[i]; // Отримати значення з кожного стовпця var businessName = row[0]; var email = row[1]; var invoiceNumber = row[2]; var invoiceAmount = row[3]; var dueDate = row[4]; змінна тема = рядок[5]; // Визначаємо тіло електронної пошти на основі суми рахунку var emailBodyHtml; if (invoiceAmount == 0) { // Тема електронного листа клієнта відтоку = "Сповіщення клієнта про відтік"; emailBodyHtml = "<html><head><style>" + "тіло {font-family: Arial, sans-serif;}" + "p {font-size: 14px;}" + ".invoice-info {font-weight: bold; колір: #4a4a4a;}" + "</style></head><body>" + "<p>Шановний " + назва компанії + ",</p>" + "<p>Ми помітили, що сума вашого рахунку становить 0 доларів США. Нам шкода, що ви йдете, і будемо вдячні за відгук про те, чому ви вирішили припинити використання наших послуг.</p>" + "<p>Якщо ми можемо щось зробити, щоб покращити наші послуги або відновити ваш бізнес, повідомте нам.</p>" + "<p>Дякуємо за вашу минулу роботу.</p>" + "</body></html>"; } else { // Звичайний рахунок-фактура emailBodyHtml = "<html><head><style>" + "тіло {font-family: Arial, sans-serif;}" + "p {font-size: 14px;}" + ".invoice-info {font-weight: bold; колір: #4a4a4a;}" + "</style></head><body>" + "<p>Шановний <span class='invoice-info'>" + назва компанії + "</span>,</p>" + "<p>Це нагадування, що рахунок-фактура #<span class='invoice-info'>" + номер рахунку + "</span> для $<span class='invoice-info'>" + Сума рахунку + "</span> термін погашення до <span class='invoice-info'>" + Термін виконання + "</span>.</p>" + "<p>Будь ласка, знайдіть вкладений рахунок-фактуру.</p>" + "<p>Дякуємо за вашу швидку увагу до цього питання.</p>" + "</body></html>"; } // Додайте відповідний рахунок-фактуру – вам потрібно вказати правильний ідентифікатор папки, де зберігаються ваші рахунки-фактури var invoiceFolderId = 'YOUR_FOLDER_ID_HERE'; var invoiceFolder = DriveApp.getFolderById(invoiceFolderId); var invoiceFiles = invoiceFolder.getFilesByName(номер рахунку + '.pdf'); // Припускаючи, що файли рахунків-фактур знаходяться у форматі PDF var invoiceFile; if (invoiceFiles.hasNext()) { invoiceFile = invoiceFiles.наступний(); } else { // Якщо файл рахунку-фактури не знайдено, ви можете пропустити цей рядок або зареєструвати помилку console.error("Файл рахунку-фактури не знайдено для номера рахунку-фактури: " + invoiceNumber); продовжити; } // Надіслати електронний лист із вкладенням MailApp.sendEmail({ to: email, subject: subject, htmlBody: emailBodyHtml, attachments: [invoiceFile] }); }}

Аж до зламу коду 

Зауважте, що ми зосереджуємося лише на тому, що міститься у функції, щоб уникнути повторення того, що вже було описано. emailBodyHtml

Оновлена ​​частина коду визначає вміст тіла електронного листа на основі суми рахунку-фактури. Якщо сума рахунка-фактури дорівнює , вважається, що це відтік клієнта, і використовується інший шаблон електронного листа. Ось розбивка коду: «0»

var emailBodyHtml;

Він оголошує змінну з іменем і зберігає вміст тіла електронної пошти. І він спочатку залишився невизначеним.emailBodyHtml

if (InvoiceAmount == 0) { ... }

Інструкція перевіряє, чи сума рахунку-фактури дорівнює 0. Якщо так, буде виконано код у фігурних дужках. Цей блок містить шаблон електронної пошти клієнта відтоку.if(`{}`)

subject = "Повідомлення про відтік клієнтів";

У цьому рядку вказується тема електронного листа для відтоку клієнтів."Сповіщення про відтік клієнтів"

emailBodyHtml = "<html><head><style>" + ...

 Рядок встановлює значення змінної для шаблону електронної пошти клієнта відтоку. Шаблон — це рядок HTML зі стилями CSS, визначеними в розділі. Тіло електронної пошти містить заповнювачі для назви підприємства та повідомлення для customer.emailBodyHtml<head>

} ще { ... }

Блок виконується, коли сума рахунку-фактури не дорівнює 0. Він встановлює змінну на звичайний шаблон електронного листа з рахунком-фактурою. Шаблон електронної пошти – це рядок HTML зі стилями CSS, визначеними в розділі. Тіло електронної пошти містить заповнювачі для назви підприємства, номера рахунка-фактури, суми рахунка-фактури та дати виконання.elseemailBodyHtml<head>

Використовуючи цю умовну логіку, сценарій надсилає інше тіло електронного листа залежно від того, чи є сума рахунку (відтік клієнта) чи відмінна від нуля (звичайний рахунок). 0

Коли змінюється значення клітинки

Тепер ми візьмемо той самий сценарій, який використовувався вище, і розширимо його, щоб охопити інший випадок використання – клієнт оновлюється, а менеджер облікового запису має надіслати електронний лист із подякою та рахунком-фактурою. 

Щоб пояснити, ідея полягає в тому, що щомісяця менеджер облікових записів має новий аркуш (аркуш 2 у нашому прикладі) з обліковими даними клієнтів. 

Код тепер порівнюватиме два аркуші та надсилатиме автоматичний електронний лист із подякою замість звичайного електронного листа з рахунком-фактурою клієнтам, які оновили (їхню суму рахунка-фактури більший порівняно з попереднім). 

Крім того, немає необхідності торкатися електронної пошти для відтоку, оскільки існує ймовірність, що хтось вирішив припинити використання нашої уявної служби. Ось сценарій.

функція sendEmailReminders() { var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); var dataRange1 = sheet1.getRange(2, 1, sheet1.getLastRow() - 1, sheet1.getLastColumn()); var dataRange2 = sheet2.getRange(2, 1, sheet2.getLastRow() - 1, sheet2.getLastColumn()); var data1 = dataRange1.getValues(); var data2 = dataRange2.getValues(); for (var i = 0; i < data1.length; i++) { var row1 = data1[i]; змінна рядок2 = дані2[i]; var businessName = row1[0]; var email = row1[1]; var invoiceNumber = row1[2]; var invoiceAmount1 = parseFloat(row1[3].toString().replace('$', '').replace(',', 39;.')); var invoiceAmount2 = parseFloat(row2[3].toString().replace('$', '').replace(',', 39;.')); if (isNaN(invoiceAmount1) || isNaN(invoiceAmount2)) { console.error("Недійсні суми рахунків-фактур для бізнесу: " + BusinessName + ". invoiceAmount1: " + invoiceAmount1 + ", invoiceAmount2: " + invoiceAmount2 ); продовжити; } var dueDate = row1[4]; змінна тема; var emailBodyHtml; if (invoiceAmount1 < invoiceAmount2) { console.log("Надсилання електронного листа 'подяки за оновлення' на " + email + ". invoiceAmount1: " + invoiceAmount1 + ", invoiceAmount2: " + Сума рахунку2); subject = "Дякуємо за оновлення"; emailBodyHtml = "<html><body>" + "<p>Шановний " + назва компанії + ",</p>" + "<p>Дякуємо за оновлення! Ми цінуємо ваш бізнес і з нетерпінням чекаємо на обслуговування.</p>" + "<p>З повагою,</p>" + "<p>Ваша компанія</p>" + "</body></html>"; MailApp.sendEmail({ to: email, subject: subject, htmlBody: emailBodyHtml }); } else if (invoiceAmount1 == 0) { console.log("Надсилання електронного листа 'Churn customer notification' на " + email + ". invoiceAmount1: " + invoiceAmount1); subject = "Повідомлення про відтік клієнтів"; emailBodyHtml = "<html><head><style>" + "тіло {font-family: Arial, sans-serif;}" + "p {font-size: 14px;}" + ".invoice-info {font-weight: bold; колір: #4a4a4a;}" + "</style></head><body>" + "<p>Шановний " + назва компанії + ",</p>" + "<p>Ми помітили, що сума вашого рахунку становить 0 доларів США. Нам шкода, що ви йдете, і будемо вдячні за відгук про те, чому ви вирішили припинити використання наших послуг.</p>" + "<p>Якщо ми можемо щось зробити, щоб покращити наші послуги або відновити ваш бізнес, повідомте нам.</p>" + "<p>Дякуємо за вашу минулу роботу.</p>" + "</body></html>"; MailApp.sendEmail({ to: email, subject: subject, htmlBody:emailBodyHtml }); } else { console.log("Надсилання електронного листа 'Нагадування про рахунок' на адресу " + email + ". invoiceAmount1: " + invoiceAmount1 + ", invoiceAmount2: " + invoiceAmount2); тема = "Нагадування про рахунок"; emailBodyHtml = "<html><head><style>" + "тіло {font-family: Arial, sans-serif;}" + "p {font-size: 14px;}" + ".invoice-info {font-weight: bold; колір: #4a4a4a;}" + "</style></head><body>" "<p>Шановний <span class='invoice-info'>" + назва компанії + "</span>,</p>" + "<p>Це нагадування, що рахунок-фактура #<span class='invoice-info'>" + номер рахунку + "</span> для $<span class='invoice-info'>" + Сума рахунку1 + "</span> термін погашення до <span class='invoice-info'>" + Термін виконання + "</span>.</p>" + "<p>Будь ласка, знайдіть вкладений рахунок-фактуру.</p>" + "<p>Дякуємо за вашу швидку увагу до цього питання.</p>" + "</body></html>"; // Додайте відповідний рахунок-фактуру – вам потрібно вказати правильний ідентифікатор папки, де зберігаються ваші рахунки-фактури var invoiceFolderId = 'YOUR_FOLDER_ID_HERE'; var invoiceFolder = DriveApp.getFolderById(invoiceFolderId); var invoiceFiles = invoiceFolder.getFilesByName(номер рахунку + '.pdf'); // Припускаючи, що файли рахунків-фактур знаходяться у форматі PDF var invoiceFile; if (invoiceFiles.hasNext()) { invoiceFile = invoiceFiles.next(); } else { // Якщо файл рахунку-фактури не знайдено, ви можете пропустити цей рядок або зареєструвати помилку console.error("Файл рахунку-фактури не знайдено для номера рахунку-фактури: " + invoiceNumber); продовжити; } MailApp.sendEmail({ to: email, subject: subject, htmlBody: emailBodyHtml, attachments: [invoiceFile] }); } } }</p>" + "</body></html>"; // Додайте відповідний рахунок-фактуру – вам потрібно вказати правильний ідентифікатор папки, де зберігаються ваші рахунки-фактури var invoiceFolderId = 'YOUR_FOLDER_ID_HERE'; var invoiceFolder = DriveApp.getFolderById(invoiceFolderId); var invoiceFiles = invoiceFolder.getFilesByName(номер рахунку + '.pdf'); // Припускаючи, що файли рахунків-фактур знаходяться у форматі PDF var invoiceFile; if (invoiceFiles.hasNext()) { invoiceFile = invoiceFiles.next(); } else { // Якщо файл рахунку-фактури не знайдено, ви можете пропустити цей рядок або зареєструвати помилку console.error("Файл рахунку-фактури не знайдено для номера рахунку-фактури: " + invoiceNumber); продовжити; } MailApp.sendEmail({ to: email, subject: subject, htmlBody: emailBodyHtml, attachments: [invoiceFile] }); } } }</p>" + "</body></html>"; // Додайте відповідний рахунок-фактуру – вам потрібно вказати правильний ідентифікатор папки, де зберігаються ваші рахунки-фактури var invoiceFolderId = 'YOUR_FOLDER_ID_HERE'; var invoiceFolder = DriveApp.getFolderById(invoiceFolderId); var invoiceFiles = invoiceFolder.getFilesByName(номер рахунку + '.pdf'); // Припускаючи, що файли рахунків-фактур знаходяться у форматі PDF var invoiceFile; if (invoiceFiles.hasNext()) { invoiceFile = invoiceFiles.next(); } else { // Якщо файл рахунку-фактури не знайдено, ви можете пропустити цей рядок або зареєструвати помилку console.error("Файл рахунку-фактури не знайдено для номера рахунку-фактури: " + invoiceNumber); продовжити; } MailApp.sendEmail({ to: email, subject: subject, htmlBody: emailBodyHtml, attachments: [invoiceFile] }); } } }

Аж до зламу коду 

1. Сценарій починається з отримання посилань на аркуш Sheet1 і Sheet2.

var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");

2. Потім він отримує дані з обох аркушів, починаючи з другого рядка, щоб виключити заголовки.

var dataRange1 = sheet1.getRange(2, 1, sheet1.getLastRow() - 1, sheet1.getLastColumn()); var dataRange2 = sheet2.getRange(2, 1, sheet2.getLastRow() - 1, sheet2.getLastColumn()); var data1 = dataRange1.getValues(); var data2 = dataRange2.getValues();

3. Сценарій повторює рядки на обох аркушах (за умови, що кількість рядків на обох аркушах однакова). Він порівнює суми рахунків-фактур із аркушів1 та аркушів2 для кожного відповідного рядка.

for (var i = 0; i < data1.length; i++) { var row1 = data1[i]; змінна рядок2 = дані2[i]; // Отримати суми рахунків-фактур з обох аркушів var invoiceAmount1 = parseFloat(row1[3].toString().replace('$', '').replace(' ,', '.')); var invoiceAmount2 = parseFloat(row2[3].toString().replace('$', '').replace(',', 39;.'));

Копіювати

4. Потім сценарій перевіряє умови для надсилання різних типів електронних листів на основі порівняння сум рахунків-фактур із Аркуша1 та Аркуша2.

if (invoiceAmount1 < invoiceAmount2) { // Надіслати "Дякуємо за оновлення" email } else if (invoiceAmount1 == 0) { // Надіслати "Повідомлення про відтік клієнта" email } else { // Надіслати "Нагадування про рахунок" електронна пошта }

Копіювати

Ключове порівняння , яке перевіряє, чи сума рахунка-фактури на Аркуші1 менша за суму рахунку-фактури на Аркуші2 для того самого рядка (тобто того самого клієнта). Якщо значення true, сценарій припускає, що клієнт оновив програму, і надсилає електронний лист. В іншому випадку він перевіряє наявність інших умов (відтік або звичайні нагадування про рахунок-фактуру) і надсилає відповідний email.if (invoiceAmount1 < invoiceAmount2)"Дякуємо за оновлення"

Коли оновлюється файл Google Таблиць

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

Припустімо, що наш менеджер по роботі з клієнтами має день, присвячений зустрічі з клієнтами та відповідям на їхні запитання. Клієнти мають доступ до електронної таблиці, де вони можуть коротко описати проблему та забронювати слот. 

Гаразд, є набагато кращі способи обробки бронювань і запитів клієнтів. Але ми будемо дотримуватися цього підходу заради підручника.

Крок 1

Спочатку нам потрібно створити таблицю. Як показано нижче, наш досить простий, містить лише три рядки з менеджером, часовим інтервалом і запитом.

Крок 2

Далі вам знадобляться скрипти Google, щоб запускати електронні листи, коли хтось оновлює аркуш із своїм запитом, таким чином бронюючи слот. Ось приклад. 

//@OnlyCurrentDoc function processEdit(e) { MailApp.sendEmail({ to: "[email protected]" ;, тема: "Нове бронювання — часовий проміжок клієнта", тіло: "У клієнта є до вас запитання." }); }

Копіювати

Щоб допомогти вам зрозуміти, що відбувається, варто обговорити основні функції. 

  • //@OnlyCurrentDoc – ця анотація означає, що ви хочете, щоб сценарій запускався лише у вказаній таблиці Google. Видалення анотації активує сценарій в інших ваших файлах. 
  • function processEdit () – тригер (ми налаштуємо на наступному кроці) запускає сценарій із цією функцією. Просто функція налаштовує процес на отримання електронного листа кожного разу, коли хтось оновлює аркуш.
  • (e) – ця анотація представляє об’єкт із даними про правки. Він має властивість діапазону, яка сигналізує про те, що діапазон або комірку було відредаговано. 
  • MailApp – об’єкт, який функція використовує для ретрансляції електронної пошти. 

Перш ніж рухатися далі, ви можете протестувати аркуш і код. Якщо ви використовуєте зразковий аркуш, просто заповніть одну з клітинок у стовпці «Запит» і запустіть сценарій. Електронний лист має надійти до вашої папки "Вхідні" негайно, але зауважте, що сценарій ще не автоматизовано.

Крок 3

Настав час налаштувати та авторизувати тригер для автоматичного надсилання електронних листів. У Apps Script клацніть піктограму будильника в бічному меню. Потім натисніть «…створити новий тригер». 

У спливаючому вікні конфігурації тригера виберіть наступні критерії.

  • processEdit
  • Голова
  • З електронної таблиці
  • На ред

Примітка. що при необхідності. Це не вплине на загальну роботу тригера чи сценарію. Це може стосуватися будь-якого сценарію Google, який ви захочете автоматизувати.

Натисніть Зберегти, авторизуйте тригер у своєму обліковому записі, і ви побачите це в  Список тригерів . Також не забудьте натиснути кнопку Deploy , щоб активувати тригер. 

Тепер ви можете повернутися до аркуша, заповнити іншу клітинку в стовпці «Запит» і перевірити, чи отримали ви автоматичне сповіщення. 

Додаткова примітка. Ви можете налаштувати аркуш відповідно до своїх уподобань, але це означає, що вам також потрібно буде налаштувати сценарій.

Tags: #ЯК

[100% вирішено] Як виправити повідомлення «Помилка друку» у Windows 10?

[100% вирішено] Як виправити повідомлення «Помилка друку» у Windows 10?

Отримання повідомлення про помилку друку у вашій системі Windows 10, тоді дотримуйтеся виправлень, наведених у статті, і налаштуйте свій принтер на правильний шлях…

Як записати та відтворити запис Microsoft Teams

Як записати та відтворити запис Microsoft Teams

Ви можете легко повернутися до своїх зустрічей, якщо запишете їх. Ось як записати та відтворити запис Microsoft Teams для наступної зустрічі.

Як скинути програми за замовчуванням на Android

Як скинути програми за замовчуванням на Android

Коли ви відкриваєте файл або клацаєте посилання, ваш пристрій Android вибирає програму за умовчанням, щоб відкрити його. Ви можете скинути стандартні програми на Android за допомогою цього посібника.

ВИПРАВЛЕНО: помилка сертифіката Entitlement.diagnostics.office.com

ВИПРАВЛЕНО: помилка сертифіката Entitlement.diagnostics.office.com

ВИПРАВЛЕНО: помилка сертифіката Entitlement.diagnostics.office.com

10 найпопулярніших веб-сайтів з іграми, які школа не блокувала у 2022 році

10 найпопулярніших веб-сайтів з іграми, які школа не блокувала у 2022 році

Щоб дізнатися про найкращі ігрові сайти, які не блокуються школами, прочитайте статтю та виберіть найкращий веб-сайт із розблокованими іграми для шкіл, коледжів і робіт

ВИПРАВЛЕНО: принтер у стані помилки [HP, Canon, Epson, Zebra та Brother]

ВИПРАВЛЕНО: принтер у стані помилки [HP, Canon, Epson, Zebra та Brother]

Якщо ви зіткнулися з проблемою стану помилки принтера на ПК з Windows 10 і не знаєте, як із нею впоратися, дотримуйтесь цих рішень, щоб її виправити.

Як створити резервну копію Chromebook (2022)

Як створити резервну копію Chromebook (2022)

Якщо вам цікаво, як створити резервну копію Chromebook, ми допоможемо вам. Дізнайтеся більше про те, що створюється автоматично, а що ні, тут

Як виправити, що програма Xbox не відкривається в Windows 10 [КОРОТКИЙ ПОСІБНИК]

Як виправити, що програма Xbox не відкривається в Windows 10 [КОРОТКИЙ ПОСІБНИК]

Хочете виправити програму Xbox, яка не відкривається в Windows 10, а потім дотримуйтеся виправлень, як-от увімкнути програму Xbox із служб, скинути налаштування програми Xbox, скинути пакет програми Xbox тощо.

Що таке LogiOptions.exe (UNICODE) і чи безпечний процес?

Що таке LogiOptions.exe (UNICODE) і чи безпечний процес?

Якщо у вас клавіатура та миша Logitech, ви побачите, що цей процес виконується. Це не шкідливе програмне забезпечення, але це не важливий виконуваний файл для ОС Windows.

Виправлена ​​помилка оновлення/встановлення Java 1603 у Windows 10

Виправлена ​​помилка оновлення/встановлення Java 1603 у Windows 10

Прочитайте статтю, щоб дізнатися, як виправити помилку Java Update 1603 у Windows 10, спробуйте наведені виправлення одне за одним і легко виправте помилку 1603…