Скрипт Google Apps - отправка электронной почты на основе значения в ячейке

Я новичок в 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. будьте осторожны также с getValues, который возвращает массив 2d. Также таким образом вы запрашиваете активный лист. Вместо этого укажите имя листа. Это не будет работать как функция запуска по времени, если вы планируете использовать такой активный лист. После того, как вы разберетесь со всем этим, вы можете подумать о том, как вы можете создать цикл.

Marios 10.12.2020 15:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
5 566
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Объяснение:

Всего несколько моментов, чтобы сделать процесс понятным:

  • Я предполагаю, что вы выполняете 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 10.12.2020 17:46

@Dpuiatti нет причин извиняться и игнорировать отрицательные отзывы и отрицательные отзывы. Мы все здесь, чтобы учиться. Я бы порекомендовал вам начать здесь, чтобы понять основы, а затем вы можете использовать другие ресурсы, такие как youtube/stackoverflow и т. д. Я бы избегал блогов в Интернете, если авторы не являются экспертами в этой области.

Marios 10.12.2020 17:48

Другие вопросы по теме