Я новичок в Google App Scripts, и у меня есть электронная таблица с тремя столбцами: имя, просрочено и последний контакт:
Я хотел бы отправить себе напоминание по электронной почте, содержащее имя любого, у кого просрочено значение в столбце B.
До сих пор мне удалось написать сценарий, который отправляет электронное письмо самому себе для строки 2. Я не могу понять, как заставить сценарий перебирать значения в столбце B.
Вот мой сценарий:
function sendEmail() {
var overdueRange = SpreadsheetApp.getActiveSpreadsheet().getRange("B2");
var overdueValue = overdueRange.getValue();
if (overdueValue === "Overdue"){
var nameRange = SpreadsheetApp.getActiveSpreadsheet().getRange("A2");
var name = nameRange.getValues();
var message = 'Reach out to ' + name
var subject = 'Reach out to this person.'
MailApp.sendEmail('[email protected]', subject, message);
}
}
sendEmail()
Всего несколько моментов, чтобы сделать процесс понятным:
Я предполагаю, что вы выполняете sendEmail()
из редактора скриптов. Таким образом, поскольку у вас также есть sendEmail()
вне функции, вы в конечном итоге вызовете sendEmail()
дважды. Удалите «глобальный» вызов функции и вызовите только sendEmail()
из редактора скриптов.
Не рекомендуется применять getRange
к объекту электронной таблицы. Определите конкретный лист по его имени или положению. В приведенном ниже примере скрипта я определяю лист по его имени (Sheet1
). Измените это имя на ваш фактический случай.
name
в вашем коде — это двумерный массив, а не одно значение. Будьте осторожны с этим, так как это не правильный способ сделать это.
В моем сценарии ниже я определяю массив столбцов A
и B
. Имена указаны в столбце A
, а статус просроченного — в столбце B
. Таким образом, вы можете повторять этот массив и получать отдельные значения за итерацию, обращаясь к самому массиву. Я использовал forEach, но не стесняйтесь использовать свой собственный метод итерации.
function sendEmail() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet1'); // change Sheet1 to the name of your sheet
const data = sh.getRange('A2:B'+sh.getLastRow()).getValues();
data.forEach(r=>{
let overdueValue = r[1];
if (overdueValue === "Overdue"){
let name = r[0];
let message = 'Reach out to ' + name;
let subject = 'Reach out to this person.'
MailApp.sendEmail('[email protected]', subject, message);
}
});
}
Лист, который работает для скрипта:
Это работает безупречно. Извиняюсь за мой плохой код, я привык к JS и испытываю некоторые трудности с пониманием сценариев приложений Google. Есть ли у вас какие-либо рекомендации, где я могу прочитать об этом?
@Dpuiatti нет причин извиняться и игнорировать отрицательные отзывы и отрицательные отзывы. Мы все здесь, чтобы учиться. Я бы порекомендовал вам начать здесь, чтобы понять основы, а затем вы можете использовать другие ресурсы, такие как youtube/stackoverflow и т. д. Я бы избегал блогов в Интернете, если авторы не являются экспертами в этой области.
Вы так дважды звоните
sendEmail
. будьте осторожны также сgetValues
, который возвращает массив 2d. Также таким образом вы запрашиваете активный лист. Вместо этого укажите имя листа. Это не будет работать как функция запуска по времени, если вы планируете использовать такой активный лист. После того, как вы разберетесь со всем этим, вы можете подумать о том, как вы можете создать цикл.