Где мы объединяем наши скрипты и добавляем временные метки в нашу базу данных

В Часть 1 и Часть 2 нам удалось настроить приложение, которое берет данные из таблиц Google, преобразует их в CSV, создает матрицу из CSV и создает черновик сообщения в Gmail с персонализированными сообщениями и шаблонами. Эта часть будет посвящена последним штрихам: мы начнем с объединения сценариев конвертировать в CSV и создать персонализированный черновик, чтобы нам не приходилось вручную копировать и вставлять идентификатор CSV-файла каждый раз, когда мы хотим запустить приложение. Затем мы закончим, написав некоторый код, который ищет идентификатор пользователя в базе данных и помещает текущую дату в указанный столбец в той же строке, указывая, что мы отправили им письмо в этот день. Давайте приступим!

Полный код доступен в моей учетной записи Github: https://github.com/istvanerdo/google-script-autodraft/blob/master/code.gs

Объединить скрипты

Откройте 2 файла сценария, написанные ранее, и создайте новый. В новый файл вставьте код, который преобразует лист в CSV-файл, и прямо под ним код, который создает персонализированные черновики.

До этого момента мы заставляли наше приложение создавать новый файл каждый раз, когда мы конвертировали его в CSV. Теперь мы можем избавиться от этого шага, так как нам не нужно сохранять содержимое файла, чтобы что-то с ним делать.

Возьмите часть, которая создает файл CSV:

// create a file in the Docs List with the given name and the csv data
DriveApp.createFile(fileName, csvFile);

и замените его на:

// create draft from csv
makeDraft(csvFile)

Последний код выполняет нашу функцию makeDraft для уже определенной переменной csvFile.

У нас уже есть данные, хранящиеся в переменной csvFile, поэтому из функции makeDraft удалите часть, которая получает данные:

// Gets file content
var data = DriveApp.getFileById(“********”).getBlob().getDataAsString()

Я также переименовал основную функцию, потому что теперь она создает наш окончательный черновик, поэтому вместо того, чтобы называть ее saveAsCSV, мы можем назвать ее finalDraft.

Теперь давайте проверим, работает ли он так, как задумано. Убедитесь, что вы выбрали функцию для выполнения (finalDraft) в раскрывающемся меню рядом со значками запуска и отладки.

Отлично, это работает! Мы закончили слияние скрипта. Если вы проверите свой диск, вы увидите, что на этот раз он не создал никаких новых файлов. Это именно то, чего мы хотели добиться.

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

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

Этот раздел кода основан на вопросе Stack Overflow, заданном user1783229 и на который ответил Serge insas.

Под закрывающим } функции makeDraft мы создаем новую функцию с именем addCustomValue(). Эта функция будет иметь 3 аргумента: sheetNamestr, searchKeystr и writeValstr, которые являются именем листа, на котором мы заставим приложение выполнять задачу, строкой, которую мы будем искать в заданном столбце, и строкой, которую мы запишем в строке. мы нашли строку поиска в, соответственно.

function addCustomValue(sheetNamestr, searchKeystr, writeValstr) {
}

Напишите остальную часть кода между { }. С помощью функции нам сначала нужно получить данные, которые мы уже сделали в начале нашего кода. К счастью, мы сохранили его в переменной ss. Давайте удостоверимся, что мы работаем на правильном листе:

// Get all data
var sheet = ss.getSheetByName(sheetNamestr)
var ssdata = sheet.getDataRange().getValues()

Чтобы это работало, нам нужно добавить ss ко всем аргументам функции, в которых мы хотим его использовать. Если мы пропустим этот шаг, наше приложение не распознает, что ss, который мы используем в функции addCustomValue, совпадает с ss, который мы определили. в функции finalDraft. Вернитесь туда, где мы определили addCustomValue, и напишите ss в конец списка аргументов. Сделайте это и для makeDraft тоже. Вернитесь к тому месту, где мы назвали makeDraft, и также добавьте к нему ss.

Вернемся к функции addCustomValue. Теперь переменная ssdata представляет все данные, присутствующие в нашей электронной таблице. Мы можем использовать цикл for, чтобы просмотреть каждую строку электронной таблицы и установить указанные нами значения. Структура цикла for выглядит так: for (statement1; statement2; statement3){code block to be executed}. Оператор1 выполняется перед каждым циклом (блоком кода), оператор2 является условием запуска цикла, а оператор3 выполняется после каждого цикла. Имея это в виду, мы настроили наш цикл for (n будет обозначать номер строки, где 0 — первая строка):

// Loop through the data
for (n=0; n<ssdata.length; ++n) {
}

Это означает, что для каждого цикла мы проверяем, меньше ли текущий номер цикла, чем длина наших данных (поскольку мы хотим пройти только строки, содержащие информацию, а не тысячи строк пустых ячеек), если условие выполняется, он выполняет код внутри { }, если нет, то останавливается. Мы начинаем с n=0 и после каждого цикла добавляем 1, используя ++n.

Теперь для блока кода внутри { } мы добавляем условие if для проверки на соответствие:

// Rewrite value
if (ssdata[n][1–1].toString()==searchKeystr){
ssdata[n][7–1] = writeValstr
}

Это устанавливает 7-й столбец в текущей строке равным любому параметру writeValstr, который мы указываем при вызове функции, только если выполняется наше условие в ( ). Условие состоит в том, что приложение должно посмотреть значение 1-го столбца [1–1] текущей строки [n], преобразовать его в строку и проверить, равен ли указанный нами searchKeystr этому значению.

Мы должны быть осторожны, потому что это не устанавливает значение writeValstr, а только сохраняет его. Чтобы убедиться, что наши изменения сохранены, нам нужно использовать setValue на всем листе. Берем переменную нашего листа; получить диапазон с getRange(), который будет принимать в качестве аргументов начальную строку, начальный столбец, количество строк и количество столбцов (подробнее об этом см. в документации); и установите значения ssdata. Поместите его вне цикла for, так как нам нужно сделать это только один раз в функции addCustomValue.

sheet.getRange(1,1,ssdata.length,ssdata[0].length).setValues(ssdata)

Часть, где мы написали ssdata.length, получает количество строк, а ssdata[0].length — количество столбцов в первой строке. Нам нужно будет вызывать эту функцию для каждого пользователя, поэтому вернитесь к тому месту, где мы вызывали функцию createDraft, и добавьте под ней следующий код:

// Add date stamp to registered_users sheet
addCustomValue(‘Sheet1’, userId, Utilities.formatDate(new Date(), “GMT+1”, “yyyy/MM/dd”), ss)

Мы хотим добавить значение к листу с именем Лист1 (или как вы назвали свой лист), мы хотим найти userId в первом столбце, и мы хотим поместить текущую дату в 6-й столбец.

Чтобы сделать наше приложение более полным, давайте добавим еще несколько строк кода. Часть, где мы сказали приложению возвращаться, если нет электронной почты, можно сделать более полной с нашей новой функцией, поэтому замените ее следующим:

// Put X if no email
if(email === “NULL”){
addCustomValue(‘Sheet1’, userId, “X”, ss)
return
}

Это поставит X в столбец «Отправленное письмо» и пропустит его, а не просто пропустит. Под этим напишем еще один случай, когда мы хотим пропустить строку, если мы уже отправили письмо этому человеку (когда столбец letterSent не пуст, !=””):

//Return if already written email to the user
if(letterSent != "") return

Мы еще не указали letterSent, поэтому вернемся к нашему списку переменных столбца и добавим:

var letterSent = cell[6]

Последнее, что осталось сделать, это запустить его и молиться, чтобы он работал. Вы можете найти полный код ниже:

После запуска finalDraft:

У нас есть свои черновики.

И у нас есть заполненный столбец «Отправлено письмо». Если вы снова запустите код, вы увидите, что он не будет создавать больше черновиков, поскольку у вас уже есть столбец «Отправлено письмо» для каждой строки.

Мы закончили с нашим приложением. Спасибо, что остались со мной в этом уроке, надеюсь, мне удалось научить вас чему-то новому. Если у вас есть какие-либо вопросы, свяжитесь со мной по электронной почте [email protected] или через Facebook www.facebook.com/samebug.io. Для получения дополнительных сообщений в блоге от меня и других членов команды Samebug следите за нашим блогом на blog.samebug.io.

Эта история изначально была опубликована на Мосте Будапешт.