Google Script для отправки электронной почты, содержащий значения из листа - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь заставить работать скрипт, который подключается к листу Google, извлекает информацию, полученную с телефона, и отправляет ее по электронной почте, как только будет отмечен.Пока у меня есть это, из источников в Интернете и немного настройки.

function sendApprovalEmail() {

var sheetNameToWatch = "SHEETNAMEGOESHEREUSUALLY";
var columnNumberToWatch = 12; // column A = 1, B = 2, etc.
var valueToWatch = "SENT";

var date = 5;
var name = 9;
var number = 10;
var message = 11;

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getActiveCell();

if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {
var emailAddress = "MYEMAILGOESHEREUSUALLY";
var subject = "Missed Call Notifcation";
var email = "Hello! "+date+" "+name+" "+number+" "+message+"";
MailApp.sendEmail(emailAddress, subject, email);
}
}

Выше работает, запускает и отправляет правильно.Единственное, что он не делает, это всасывает Дата, Имя, Номер и Сообщение.

Они должны быть уникальными для каждого письма, основываясь на строке, которая была только что помечена как ОТПРАВЛЕННАЯ.Обычно есть только пара в день, но не в одно и то же время.

Так что, если строка 23 помечена как ОТПРАВЛЕННАЯ, ей нужны A23, B23 и C23.Если строка 66 помечена как SENT, ей нужны A66, B66 и C66.

Как мне заставить скрипт искать значения в столбцах 5, 9, 10 и 11 обнаруженной им строки?Отправлено в?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Это, вероятно, близко к тому, что вы ищете:

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

enter image description here

Все листы, используемые для записи информации, начинаются с префикса «ph:».Я получаю весь массив листов и перебираю их в поисках листов, начинающихся с 'ph:' name.slice(0,3).После того, как я нашел, я получаю диапазон A1: B6 и собираю все данные в один массив, а затем перебираю массив, помещая всю информацию в ассоциативный массив, используя следующий алгоритм dObj [значение в столбце1] = значение в столбце2.Так что в моем примере вы можете получить имя с помощью dObj.Name, а сообщение получите с помощью dObj.Message и так далее.Таким образом, это связывает ключ в первом столбце со значением в столбце 2.

Теперь вот код:

function sendApprovalEmails(){
  var ss=SpreadsheetApp.getActive();
  var shts=ss.getSheets();
  for(var i=0;i<shts.length;i++){
    var sh=shts[i];
    var name=sh.getName();
    if(name.slice(0,3)=='ph:'){//finds the operator log sheets
      var dObj={};
      var rg=sh.getRange('A1:B6');//Use a fixed range so you can use the rest of the sheet for whatever
      var vA=rg.getValues();
      for(var j=0;j<vA.length;j++){
        dObj[vA[j][0]]=vA[j][1];//Builds the associative array
      }
      if(dObj.Approval=='Yes'){
        Logger.log('Send Email:\nDate: %s\nNumber: %s\nName: %s\nMessage: %s,To: %s',Utilities.formatDate(new Date(dObj.Date),Session.getScriptTimeZone(),"E MMM dd, yyyy"),dObj.Number,dObj.Name,dObj.Message,dObj.Email);
        var recipient=dObj.email;
        var subject="Missed Call Notification";
        var body = Utilities.formatString('Hello! %s %s %s %s',Utilities.formatDate(new Date(dObj.Date),Session.getScriptTimeZone(),"E MMM dd, yyyy"),dObj.Name,dObj.Number,dObj.Message);
        //MailApp.sendEmail(recipient, subject, body);
      }
    }
  }
}

В моем примере B1 имеет проверку данных Да или Нет.

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

Ссылка на документацию:

Кстати, эта версия вашего кода работает.

function sendApprovalEmail() {

var sheetNameToWatch = "test";
var columnNumberToWatch = 1; 
var valueToWatch = "SENT";
var date = 5;
var name = 9;
var number = 10;
var message = 11;

var ss = SpreadsheetApp.getActive();
var sheet = ss.getActiveSheet();
var range = sheet.getActiveCell();

if (sheet.getName()==sheetNameToWatch && range.getColumn()==columnNumberToWatch && range.getValue() == valueToWatch) {
var emailAddress = "foundit@found.com";
var subject = "Missed Call Notifcation";
var email = Utilities.formatString('Hello! %s %s %s %s',date,name,number,message);
//MailApp.sendEmail(emailAddress, subject, email);
  Logger.log('\nemailAddress: %s\nsubject: %s\nemail: %s',emailAddress,subject,email);
}
}

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

0 голосов
/ 04 декабря 2018

Код использует var range = sheet.getActiveCell() для получения активной ячейки.Затем вы можете использовать range.getRow() для получения номера строки, затем вы можете использовать что-то вроде sheet.getRange(range.getRow(), columnNumber), чтобы получить нужные ячейки, где columnNumber может быть 5, 9, 10 и / или 11. Другими словами, вместо

var date = 5;

используйте

var date = sheet.getRange(range.getRow(), 5).getValue();

, но поместите вышеуказанную строку после

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getActiveCell();

Сделайте то же самое для переменных name, number и message.

Примечание: есть и другие более эффективные способы, такие как sheet.getDataRange().getValues(), который возвращает массив массивов со всеми значениями листа, использование

var date = data[range.getRow()][5];

и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...