#jquery #email #google-apps-script
#jquery #Адрес электронной почты #google-apps-script
Вопрос:
В документах Google у меня есть электронная таблица с формой, которая заполняется при поступлении на новую работу. Я запускаю скрипт, который отправляет электронное письмо техническому специалисту, который проверяет работу, чтобы они знали, что новая работа введена. Я хотел бы запустить второй скрипт на листе, чтобы при изменении назначенного названия технологии во всплывающем окне подтверждения спрашивалось, хотите ли вы повторно отправить электронное письмо. Прочитав здесь, я посмотрел на диалоговое окно jquery (которое пока не работает должным образом), но у меня возникли проблемы с функцией onEdit и электронной почтой. Я хочу, чтобы функция редактирования выполнялась только в столбце F (том, в котором указаны имена). Когда я запускаю скрипт, он сообщает мне, что у него неверный адрес электронной почты, что, на мой взгляд, означает, что я сказал ему искать не в том месте. Вот код:
function onEdit() {;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = ss.getSheets()[0].getActiveCell();
var sheet2 = ss.getSheets()[4];
function doGet() {
var template = HtmlService
.createTemplateFromFile('Job confirmation');
var htmlOutput = template.evaluate()
.setSandboxMode(HtmlService.SandboxMode.NATIVE)
.setTitle('jQuery UI Dialog - Job confirmation');
return htmlOutput;}
var Customer = sheet1.getRow()[1];
var name = sheet1.getRow()[6]
var emailArray = sheet2.getDataRange().getValues();
for (i=0;i < emailArray.length;i ){
if (name == emailArray[i][1]) {
var email_address = emailArray[i][1];
}
}
var subject = "Job assignment";
var body = "A new job for " Customer " has been assigned to you. Use the GDocs app on your phone, or Follow the link to see the job: https://docs.google.com/spreadsheet/ccc?key=0Aq612nokMdeOdGVuZklaRkl5TERkc0ZXYlB5WDBadmcamp;hl=en_US#gid=0";
MailApp.sendEmail(email_address,subject,body);
}
Если кто-нибудь может указать мне правильное направление, я был бы очень благодарен
Итак, я последовал совету Сержа и не смог заставить всплывающее окно работать правильно, поэтому я подумал, что просто забуду о всплывающем окне в краткосрочной перспективе и сосредоточусь на том, чтобы заставить его работать при редактировании. Однако, когда скрипт запускается, он выполняет протоколирование, а затем завершается, не продвигаясь дальше. Расшифровка:
[14-07-07 15:36:10:692 EST] SpreadsheetApp.getActiveSpreadsheet() [0 seconds]
[14-07-07 15:36:10:693 EST] Spreadsheet.getActiveRange() [0 seconds]
[14-07-07 15:36:10:693 EST] Range.getRow() [0 seconds]
[14-07-07 15:36:10:693 EST] Range.getLastRow() [0 seconds]
[14-07-07 15:36:10:694 EST] Range.getColumn() [0 seconds]
[14-07-07 15:36:10:694 EST] Range.getLastColumn() [0 seconds]
[14-07-07 15:36:10:699 EST] Starting execution
[14-07-07 15:36:10:720 EST] Logger.log([{"range":{"rowStart":43,"rowEnd":43,"columnEnd":6,"columnStart":6},"source":{},"value":"Dan","user":{}}, []]) [0 seconds]
[14-07-07 15:36:10:720 EST] SpreadsheetApp.getActiveSpreadsheet() [0 seconds]
[14-07-07 15:36:10:793 EST] Spreadsheet.getSheets() [0.073 seconds]
[14-07-07 15:36:10:867 EST] Spreadsheet.getSheets() [0.073 seconds]
[14-07-07 15:36:10:868 EST] Logger.log([Customer row = 43, []]) [0 seconds]
[14-07-07 15:36:10:868 EST] Sheet.getRange([43, 6]) [0 seconds]
[14-07-07 15:36:11:032 EST] Sheet.getDataRange() [0.163 seconds]
[14-07-07 15:36:11:112 EST] Range.getValues() [0.078 seconds]
[14-07-07 15:36:11:112 EST] Range.toString() [0 seconds]
[14-07-07 15:36:11:113 EST] Execution succeeded [0.405 seconds total runtime]
Есть идеи?
Ответ №1:
В этом коде есть несколько ошибок …, ниже приведена копия, которая должна помочь вам заставить его работать, я не смог заставить его работать полностью, потому что мне не хватает некоторых данных о вашем варианте использования, но структура есть, и я прокомментировал наиболее важные части непосредственно в коде.
function onEdit(e) {
Logger.log(JSON.stringify(e));
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = ss.getSheets()[0]
var sheet2 = ss.getSheets()[4]; // this is Sheet number 5, prefer using sheet's name in case you move it accidentally.
var column = Number(e.range.columnStart);// e has all the informations about the event source (range, value ... )look at the Logger
if(column != 6){return};// if not coming from column F then return
var Customer = Number(e.range.rowStart);// gives you the row number of the edited cell
Logger.log('Customer row = ' Customer);
var name = sheet1.getRange(Customer,6);//get value in col F in row being edited
var ui = SpreadsheetApp.getUi();// this is how the popup is shown in a SS
var popup = showHTMLUi;
ui.showModalDialog(popup,'confirmation message');// show the popup
// some value has to be returned from this UI to allow taking a decision about the code below
var emailArray = sheet2.getDataRange().getValues();// get All emails adresses
for (i=0;i < emailArray.length;i ){
if (name == emailArray[i][1]) { // be sure to choose the right index, arrays count from 0 so emailArray[i][1] means column B... is that right ?
var email_address = emailArray[i][1];
}
}
var subject = "Job assignment";
var body = "A new job for " Customer " has been assigned to you. Use the GDocs app on your phone, or Follow the link to see the job: https://docs.google.com/spreadsheet/ccc?key=0Aq612nokMdeOdGVuZklaRkl5TERkc0ZXYlB5WDBadmcamp;hl=en_US#gid=0";
MailApp.sendEmail(email_address,subject,body);
}
function showHTMLUi() {// this function has to be separated from the onEdit function
var template = HtmlService.createTemplateFromFile('Job confirmation');
var htmlOutput = template.evaluate().setTitle('jQuery UI Dialog - Job confirmation');// default mode is 'Native'
return htmlOutput;
}
Комментарии:
1. Серж, все работает хорошо, но я не могу заставить всплывающее окно всплывать. Также вы были правы, у меня был неправильный индекс в массиве. Всплывающее окно работает при тестировании с помощью развертывания веб-приложения, но поскольку оно не развертывается, ответа нет, и сценарий завершается
2. Извините, я в отпуске без доступа к компьютеру, только мой мобильный телефон …. пока не могу ни протестировать, ни реально помочь. попробуйте сделать репост по конкретному вопросу. еще раз извините.
Ответ №2:
Я нашел ошибку в приведенном выше коде, не выдерживающем всплывающего окна, без которого, как я полагал, я мог бы обойтись на данный момент. Код завершался, потому что регистратор выдавал номер строки в качестве клиента и «Диапазон» в качестве имени. Поскольку я добавил строку в массив, чтобы завершить, если имя не совпадает, скрипт завершился без отправки.
`var Customerrow = Number(e.range.rowStart);`
`var Customer = sheet1.getSheetValues(Customerrow,2,1,1);`
`Logger.log('Customer row = ' Customerrow);`
`var name = sheet1.getSheetValues(Customerrow,6,1,1);`
Использование getSheetValues(rowstart,columnstart,number_of_rows,number_of_columns)
решило эту проблему.
Еще раз спасибо Serge за ваш код.