#google-apps-script #google-sheets #google-forms
Вопрос:
В настоящее время я занимаюсь проектом, в котором пользователи заполняют простую форму имени, адреса электронной почты и загружают один PDF-файл.
При отправке формы в GSheet назначения этой формы указываются имя, адрес электронной почты и URL-адрес загруженного PDF-файла. После отправки формы я могу выполнить автоматический ответ с помощью электронного письма с HTML-кодом, в котором говорится: «Получил отправку вашей формы с прикрепленным файлом». Но можно ли прикрепить этот загруженный PDF-файл к этому электронному письму, просто используя URL-адрес? Я не могу найти ClassDrive для GetFileByURL. Удалось найти только getfilebyname / type .
Я могу придумать другой способ, который заключается в том, чтобы пользователь вручную вводил имя загружаемого файла в форму и использовал скрипт приложения Google для getfilebyname. Однако я пытаюсь избежать человеческой ошибки. Человеческая ошибка, например, имя загруженного файла и имя файла, введенное в форме, не совпадают. 🙂
function onSubmit(e) {
var ss = SpreadsheetApp.getActive();
var range = e.range
var row = Number(range.getRow());
var upFolder = DriveApp.getFolderById("ADDRESS OF WHERE THE UPLOADED FILE FROM THE FORM IS");
var formReceived = HtmlService.createTemplateFromFile("HTML Email"); //get the html template
var parent_name = ss.getRange('B' row).getValue();
var parent_email = ss.getRange('C' row).getValue();
var fileURL = ss.getRange('D' row).getValue();
ss.getRange('E' row).setValue("Error! Email not sent.");
//Tag input into the html
formReceived.parent_name=parent_name
//Once the form is submitted, the URL will show up on the Gsheet
//in column D. Is there a way to attach the file from that URL into the mailapp below.
//Not using the line below (getfilesbyname).
var invoicereceipt = upFolder.getFilesByName("Can be manual input from form");
if(invoicereceipt.hasNext()){
MailApp.sendEmail({
to: parent_email,
name: parent_name,
htmlBody : formReceived.evaluate().getContent(),
attachments: [invoicereceipt.next().getAs(MimeType.PDF)],
});
var now = new Date()
var k = Utilities.formatDate(now,'GMT 8',"YYYY.MM.dd HH:mm:ss")
ws.getRange('E' index).setValue(k);
}
}
Комментарии:
1. Я должен извиниться за мой плохой английский. К сожалению, я не могу понять
But is it possible to attach that uploaded pdf in that email just using the URL? I am not able to find a ClassDrive for GetFileByURL. Only could find getfilebyname/type.
. Могу ли я спросить вас о текущей проблеме вашего сценария и вашей цели? И можете ли вы предоставить свой текущий сценарий?2. К сожалению, у меня нет рабочего скрипта. Цель: пользователь отправляет форму Google с 3 входами. Имя, адрес электронной почты, загрузка pdf. > Назначение в таблицу Google с 3 столбцами. Имя, адрес электронной почты, URL загруженного PDF-файла. > Автоматическое электронное письмо будет отправлено на адрес электронной почты с текстом письма «Получено» к этому письму прикреплен загруженный PDF-файл, который был отправлен через форму.
3. Спасибо за ответ. Я снова должен извиниться за мой плохой английский. К сожалению, я все еще не могу понять ваш вопрос. Но я хотел бы попытаться это понять. Когда я смогу правильно это понять, я хотел бы подумать о решении. Я был бы признателен, если бы вы могли простить мое плохое знание английского.
4. Форма Google содержит 3 вопроса: имя, адрес электронной почты, загрузка файла. Когда пользователь отправил форму и загрузил PDF-файл, мне нужно, чтобы скрипт приложения Google автоматически отправлял электронное письмо на адрес электронной почты и прикреплял загруженный PDF-файл. Я также отредактировал свой исходный пост с помощью скрипта.
5. Спасибо за ответ и добавление дополнительной информации. Из вашей дополнительной информации я предложил модифицированный сценарий в качестве ответа. Не могли бы вы подтвердить это, пожалуйста? Если это было бесполезно, я приношу свои извинения.
Ответ №1:
Я считаю, что ваша цель заключается в следующем.
- Вы хотите отправить электронное письмо при отправке формы Google. На данный момент вы хотите прикрепить загруженный PDF-файл к электронному письму.
- Ваш скрипт существует в электронной таблице Google, связанной с формой Google.
- Ваша функция
onSubmit
установлена как устанавливаемый триггер onSubmit.
Точки изменения:
- Заголовок сообщения электронной почты не включен. В этом случае возникает ошибка.
ws
,index
не объявлены.- В этом случае я подумал, что можно использовать объект event.
Когда эти пункты отражаются в скрипте, это выглядит следующим образом.
Модифицированный сценарий:
function onSubmit(e) {
var [, parent_name, parent_email, fileURL] = e.values;
var formReceived = HtmlService.createTemplateFromFile("HTML Email");
formReceived.parent_name = parent_name;
MailApp.sendEmail({
subject: "sample mail",
to: parent_email,
name: parent_name,
htmlBody: formReceived.evaluate().getContent(),
attachments: [DriveApp.getFileById(fileURL.split("=").pop())],
});
// e.range.offset(0, 1).setValue("Error! Email not sent."); // I'm not sure whether you want to use this line.
}
- Загруженный PDF-файл извлекается
DriveApp.getFileById(fileURL.split("=").pop())
. - В этом случае, пожалуйста, удалите устанавливаемый триггер onSubmit и переустановите его снова. При этом включаются дополнительные области.
Примечание:
- Это простой модифицированный скрипт. Поэтому, пожалуйста, измените его для вашей реальной ситуации.
Ссылка:
Комментарии:
1. Привет, Танайке, большое тебе спасибо за ответ и помощь! Да, это работает! Я хотел бы больше понять в этой строке [DriveApp.getFileById(fileURL.split(«=»).pop())]. Что делают split(«=») и pop()?
2. @dracomagmus Спасибо, что ответили. Я рад, что ваша проблема была решена. Что касается вашего дополнительного вопроса, то при загрузке файла URL-адрес выглядит
https://drive.google.com/open?id=###
следующим образом.fileURL.split("=").pop()
извлекается###
из URL-адреса. URL — адрес разделяется наsplit("=")
. Под этим подразумевается["https://drive.google.com/open?id", "###"]
. Из этого###
извлекается с помощьюpop()
.pop()
используется для извлечения последнего элемента из массива. Ссылка Если это было бесполезно, я приношу свои извинения.