2014-09-22 3 views
0

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

Я создал этот код, чтобы вызвать электронное письмо после редактирования последней ячейки в строке (dept), и я хочу сгенерировать электронное письмо, которое будет включать значения первых двух ячеек (имя, фамилия,) в субъекте и все 4 ячейки (сначала, последний, заголовок, отдел) в теле.

Но что-то не совсем так, я получаю «неопределенную» ошибку для Rowdata. Какие-либо предложения?

function sendNotificationNEWpersons() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getActiveSheet(); 
//Get Active cell 
    var mycell = ss.getActiveSelection(); 
    var cellcol = mycell.getColumn(); 
    var cellrow = mycell.getRow(); 
    var rowData = sheet.getRange(cellrow, sheet.getLastColumn()).getValues(); 
//Defined Notification Details 
    var recipients = "[email protected]"; 
    var subject = "NEW EMPLOYEE: " + rowData[0][4] + rowData[0][5] + "(Row " + mycell.getRow() + ")"; 
    var body = rowData[4] + rowData[5] + "has just been added to the NewPersons sheet on Row " + mycell.getRow() + " To view them, visit: " + ss.getUrl(); 
//If column 5 isn't empty in NewPersons sheet 
    if (cellcol == 5 && sheet.getName() == "NewPersons" && mycell.getValue() !=-1) 
    { 
//Send the Email 
    MailApp.sendEmail(recipients, subject, body); 
    } 
//End sendNotification 
    } 
+2

Не удалось проверить эту строку: var rowData = sheet.getRange (cellrow, sheet.getLastColumn()). GetValues ​​(); ", это неправильно. используйте Logger.log (rowData) и посмотрите, что вы получаете там ...Я думаю, что код должен быть «var rowData = sheet.getRange (Row, Column, NumberOfRows, NumberOfCoulmns) .getValues ​​();» –

ответ

2

У вас есть несколько ошибок в коде выше, которые вызывают неопределенные ошибки. Во-первых, вы заполняете rowData только содержимым одной ячейки, а не всей строкой, как вы, вероятно, планировали. Во-вторых, вы неправильно понимаете эту переменную rowData при настройке значений ваших переменных объекта и тела.

Предполагая, что данные в строке помещаются в столбцы AD электронной таблицы, а переменная rowData должна содержать только одну строку с 4 столбцами (соответствующими имени, фамилии, названию и отделу в этом порядке) вот фиксированная версия вашего кода:

function sendNotificationNEWpersons() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getActiveSheet(); 

    var mycell = ss.getActiveSelection(); 
    var cellcol = mycell.getColumn(); 
    var cellrow = mycell.getRow(); 

    // Get the full row of data, not just one cell 
    var rowData = sheet.getSheetValues(cellrow, 1, 1, sheet.getLastColumn()); 
    // rowData is now a 2D array of Object (cell values), with a single row 
    // and sheet.getLastColumn() columns 

    // Here, only including the first and last names in the email 
    var recipients = "[email protected]"; 
    var subject = "NEW EMPLOYEE: " + rowData[0][0] + " " + rowData[0][1] + 
     "(Row " + mycell.getRow() + ")"; 
    var body = rowData[0][0] + " " + rowData[0][1] + 
     "has just been added to the NewPersons sheet on Row " + 
     mycell.getRow() + " To view them, visit: " + ss.getUrl(); 

    //If column 5 isn't empty in NewPersons sheet 
    if (cellcol == 5 && sheet.getName() == "NewPersons" && 
     mycell.getValue() !=-1) { 
    //Send the Email 
    MailApp.sendEmail(recipients, subject, body); 
    } 
} 

Код будет избегать ошибок, которые вы видите. Однако это решение, вероятно, не лучший дизайн. Вы не указываете, как вы вызываете эту функцию (вы можете использовать элемент управления меню или триггер onEdit или другую функцию) - в зависимости от того, что выбранная ячейка находится в строке нового человека и сидит в столбце 5 может быть неверным.

Вот некоторые другие конструкции вы можете рассмотреть вместо:

  1. использовать форму Google. Вы можете создать форму с текстовыми полями (имя, фамилия, название, отдел). Затем вы можете указать ту форму onFormSubmit (e), чтобы отправлять получателям сообщения по электронной почте каждый раз, когда отправляется новая запись (form submit event object содержит все данные, введенные в форму). С этого момента новые сотрудники могут быть введены непосредственно в форму и данные будут помещены в электронную таблицу ответов на вопросы; триггер будет обрабатывать электронные письма.
  2. Создать боковую панель. Вы можете создать боковую панель для электронной таблицы, в которую пользователь может ввести данные и включить кнопку «Добавить сотрудника», чтобы записывать эти данные в электронную таблицу, отправлять электронные письма и делать все, что нужно. Этот подход фактически совпадает с использованием Google Form, но более настраиваемый и более технически сложный. Вы можете изучить Build an Add-on Quickstart, например, код о том, как построить рабочую панель.
  3. Использовать onEdit(e) триггеры правильно. Если вы настроите электронную таблицу на eDit (e), вы можете запросить событие, чтобы определить, какая ячейка была отредактирована. Вы можете использовать эту информацию, чтобы определить, в какой строке и столбце вы находитесь, не прибегая к ss.getActiveSelection(). Обратите внимание, что этот подход не идеален в том, что onEdit (e) будет срабатывать в любое время, когда будет отредактирована какая-либо ячейка в электронной таблице, поэтому требуется тщательная проверка редактируемого местоположения ячейки, прежде чем остальная часть триггера будет выполнена.