отредактируйте электронную таблицу Google и получите всплывающее окно для подтверждения отправки электронной почты

#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 за ваш код.