0

У меня есть Google Form и Google Sheet, предназначенные для сбора необходимой мне информации. В настоящее время у меня есть сценарий, который отправит мне и отправителя формы, электронное письмо с прикрепленным PDF-файлом, содержащее содержимое их представления формы.Создайте документ Doc (и PDF) данных строки при редактировании ячейки в строке листа

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

Это то, что у меня есть, я все еще очень новое в программировании и был бы признателен за любую помощь ...

(18 ноября @ 1425) Это работает! var last_column не разрешал столбцу после того, как отредактированная ячейка была определена. Когда я заменил last_column в данных var фактическим количеством столбцов, содержащих данные, он отлично работал! Спасибо всем, кто помог мне разобраться в этом, и немного поучиться на этом пути!

function onSheetEdit(e) { 

    var source = SpreadsheetApp.getActiveSpreadsheet(); 
    var source_sheet = source.getSheetByName("Form Responses 1"); 
    var range = source_sheet.getDataRange(); 
    var ActiveRow = source_sheet.getActiveRange().getRow(); 
    var data = source_sheet.getRange(ActiveRow,1,1,4).getValues(); 

    var columnA = data[0][0]; 
    var columnB = data[0][1]; 
    var columnC = data[0][2]; 
    var columnD = data[0][3]; 

(18 ноября 0800 @) Другой друг предложил изменить начало этого ... В письме также посылает, и теперь я получаю «1» «1» «/» и «1» в моем четыре документа заполнители ...

функция onSheetEdit (е) {

var source_sheet = e.source.getActiveSheet(); 
    if (source_sheet.getName() !== "Form Responses 1") return; //exit the script if edits are done on other sheets 
    var data = source_sheet.getRange(e.range.rowStart, 1, 1, source_sheet.getLastColumn())//(StartRow,StartColumn,NumberofRowstoGet,NumberofColumnstoGet) 
    .getValues()[0]; 
    Logger.log(data); 

    var columnA = data[0][0]; 
    var columnB = data[0][1]; 
    var columnC = data[0][2]; 
    var columnD = data[0][3]; 

(17 Ноябрю @ 1845) у меня был друг помочь мне с работы, и это, насколько мы получили ... электронная почта отправляется сейчас, но заполнители не заполняют данные правильно в приложении PDF-файла. Оказывается, что только данные, заселение это данные из строки 1, и из этих данных, только ячейка, которая была отредактирована, и данных в ячейках справа от нее ...

function onSheetEdit(e) { 

    var source = SpreadsheetApp.getActiveSpreadsheet(); 
    var source_sheet = source.getSheetByName("Form Responses 1"); 
    var range = source_sheet.getDataRange(); 
    var last_column = source_sheet.getActiveRange().getColumn(); 
    var ActiveRow = source_sheet.getActiveRange().getRow(); 
    var data = source_sheet.getRange(ActiveRow,1,1,last_column).getValues(); 

    var columnA = data[0][0]; 
    var columnB = data[0][1]; 
    var columnC = data[0][2]; 
    var columnD = data[0][3]; 

(16 NOV @ 1700) Я отредактировал сценарий к этому, но все еще не создал электронные письма. Я получаю эту ошибку, отправленную мне по электронной почте, когда скрипт терпит неудачу: «Ссылка на ячейку вне диапазона (строка 13, файл« Копия подтверждения подтверждения формы »)». Строка 13 - строка var.

function onSheetEdit() { 

    var source = SpreadsheetApp.getActiveSpreadsheet(); 
    var source_sheet = source.getActiveSheet() 
    var row = source_sheet.getActiveCell().getRow(); 
    var last_column = source_sheet.getLastColumn(); 
    var data = source_sheet.getRange(row,1,1,last_column).getValues(); 

    var columnA = data[0][0]; 
    var columnB = data[0][1]; 
    var columnC = data[0][2]; 
    var columnD = data[0][3]; 

(16 ноябрь 1330 @) Я попытался это, но вместо этого до сих пор нет электронной почты генерируется ...

function onSheetEdit() { 

    var source = SpreadsheetApp.getActiveSpreadsheet(); 
    var source_sheet = source.getActiveSheet() 
    var row = source_sheet.getActiveCell().getRow(); 
    var last_column = source_sheet.getLastColumn(); 
    var data = source_sheet.getRange(row,1,1,last_column); 

    var columnA = data.values[0]; 
    var columnB = data.values[1]; 
    var columnC = data.values[2]; 
    var columnD = data.values[3]; 

Оригинальный сценарий ...

function onSheetEdit(e) { 

    var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var rows = sheet.getActiveCell().getRow(); 

    var columnA = e.values[0]; 
    var columnB = e.values[1]; 
    var columnC = e.values[2]; 
    var columnD = e.values[3];  


    var docTemplate = "1WyWeCLQQ3en1EbKjOLcWxlOLc0fHHDpZrB9yfXZ7nv8"; 
    var docName = "Test form script"; 
    var carbonCopyEmail = "[email protected]"; 
    var submitterEmail = columnB; 
    var dataName = columnC; 
    var submitDate = columnA; 
    var attachmentName = docName + ' for data ' + dataName 

    var submitterEmailPlaceholder = 'keyUsername'; 
    var submitDatePlaceholder = 'keyTimestamp'; 
    var templatePlaceholder1 = 'keyQuestion1'; 
    var templatePlaceholder2 = 'keyQuestion2'; 

    var submitterSubject = "Test Script Confirmation Email for data " + dataName; 
    var submitterBody = "Attached is a PDF confirmation sheet with the details of your submission of data: " + dataName + " submitted on " + submitDate; 
    var carbonCopySubject = "Test Script Submission Notification Email for data " + dataName; 
    var carbonCopyBody = "Attached is a PDF confirmation sheet with the details of " + submitterEmail + "'s submission of data: " + dataName + " on " + submitDate; 





    //Gets document template defined by the docID above, copys it as a new temp doc, and saves the Doc’s id 
    var copyId = DocsList.getFileById(docTemplate) 
    .makeCopy(attachmentName) 
    .getId(); 
    //Open the temporary document 
    var copyDoc = DocumentApp.openById(copyId); 
    //Get the document’s body section 
    var copyBody = copyDoc.getActiveSection(); 

    //POSSIBLE MODIFICATION TO ADD LINES OF CODE 
    //Replace place holder keys with the spreadsheet values in the google doc template 
    //This section of the script looks for instances where the key appears in the Google Doc and replaces the instance 
    //with the defined variable 
    //For instance, whenever "keyUserName" (defined above as submitterEmailPlaceholder) appears in the Google Doc, 
    //the value from the spreadsheet in columnB replaces "keyUserName" 
    copyBody.replaceText(submitDatePlaceholder, columnA); 
    copyBody.replaceText(submitterEmailPlaceholder, columnB); 
    copyBody.replaceText(templatePlaceholder1, columnC); 
    copyBody.replaceText(templatePlaceholder2, columnD); 

    //Save and close the temporary document 
    copyDoc.saveAndClose(); 

    //Convert temporary document to PDF 
    var pdf = DocsList.getFileById(copyId).getAs("application/pdf"); 

    //Attaches the PDF and sends the email to the form submitter 
    MailApp.sendEmail(submitterEmail, submitterSubject, submitterBody, {htmlBody: submitterBody, attachments: pdf}); 

    //Attaches the PDF and sends the email to the recipients in copyEmail above 
    MailApp.sendEmail(carbonCopyEmail, carbonCopySubject, carbonCopyBody, {htmlBody: carbonCopyBody, attachments: pdf}); 

    //Deletes the temporary file 
    DocsList.getFileById(copyId).setTrashed(true); 
} 
+1

Что не работает в этом коде? На первый взгляд кажется, что все в порядке ... можете ли вы указать на свою проблему? –

+0

Серж, я получаю эту ошибку: TypeError: Невозможно прочитать свойства «значения» из undefined.Он выделяет var columnA. Я точно знаю, что все под e.values ​​работает, потому что оно работает в моем скрипте для создания документов при отправке формы. Часть, в которой мне нужна помощь, - это выяснить, как определить все данные в строке, которая изменяется, когда ячейка изменена. –

+0

Нормальный ... обратитесь к этому сообщению, чтобы узнать, как вы можете проверить код в редакторе скриптов: http://stackoverflow.com/questions/16089041/how-can-i-test-a-trigger-function-in -gas –

ответ

1

Вы не можете сделать data.values , data - объект диапазона, вы должны сделать getValues ​​(), чтобы получить массив значений: data [row] [col]

var data = source_sheet.getRange(row,1,1,last_column).getValues() 

var columnA = data[0][0]; 
var columnB = data[1][0]; 
var columnC = data[2][0]; 
var columnD = data[3][0]; 
+0

Спасибо @Reil, я включил это и установил уведомление в триггере при ошибке сценария. Письмо, которое я получил, говорит: «Ссылка на ячейку вне диапазона (строка 13, файл« Копия писем с подтверждением формы »)». Строка 13: «var row = source_sheet.getActiveCell(). GetRow();» –

+1

@Riel - небольшая путаница: первый индекс - это строка, вторая - столбец >> ваш пример столбца в неправильном порядке ... отвлечение Я уверен :-) –

+0

@riel Я изменил код, как было предложено, но я все еще получая ошибку строки 13 (var row) ... –

0

Почему вместо беспорядка вручную с ячейками значения листа ответов вы не используете ссылку на редактирование формы? Вы можете поместить его в почту, которую вы уже отправляете.

Вы можете получить его от:

var editLink = lastResponse.getEditResponseUrl(); 

Когда форма вновь представлена ​​по ссылке редактирования сценария вы написали сценарий будет запущен снова отправить обновленный PDF.

 Смежные вопросы

  • Нет связанных вопросов^_^