使用 GAS 将表单上传的图片嵌入 google 文档
Embed image uploaded by form to google doc using GAS
我一直在努力寻找这个问题的答案......
我有一个 google 表格(对于这个例子,我要说它是车辆的检查清单)。所以我填写表格,答案转到 sheet,sheet 中的应用程序脚本制作文档模板的副本,替换关键字,然后保存并通过电子邮件发送 pdf。这绝对没问题。
我正在尝试添加通过表单上传图片作为一些答案。图像上传到驱动器正常,但我不知道在应用程序脚本中放入什么以使图像嵌入到文档中,以便图像出现在通过电子邮件发送的 pdf 中。现在它只是为图像提供一个驱动器 link。我希望我说得有道理。
// Get template from Google Docs and name it
var docTemplate = "doc ID";
var docName = "Vehicle check with images";
// When Form Gets submitted
function onFormSubmit(e) {
//Get information from form and set as variables
var email_address = "myemailaddress@here.com";
var vehicle_vrn = e.values[1];
var front_desc = e.values[2];
var front_image = e.values[3];
var rear_desc = e.values[4];
var rear_image = e.values[5];
var driver_desc = e.values[6];
var driver_image = e.values[7];
var passenger_desc = e.values[8];
var passenger_image = e.values[9];
// Get document template, copy it as a new temp doc, and save the Doc’s id
var copyId = DriveApp.getFileById(docTemplate)
.makeCopy(docName+' for '+vehicle_vrn)
.getId();
// Open the temporary document
var copyDoc = DocumentApp.openById(copyId);
// Get the document’s body section
var copyBody = copyDoc.getActiveSection();
// Replace place holder keys,in our google doc template
copyBody.replaceText('keyVrn', vehicle_vrn);
copyBody.replaceText('keyFrontdesc', front_desc);
copyBody.replaceText('keyFrontimage', front_image);
copyBody.replaceText('keyReardesc', rear_desc);
copyBody.replaceText('keyRearimage', rear_image);
copyBody.replaceText('keyDriversdesc', driver_desc);
copyBody.replaceText('keyDriversimage', driver_image);
copyBody.replaceText('keyPassdesc', passenger_desc);
copyBody.replaceText('keyPassimage', passenger_image);
// Save and close the temporary document
copyDoc.saveAndClose();
// Convert temporary document to PDF
var pdf = DriveApp.getFileById(copyId).getAs("application/pdf");
// Attach PDF and send the email
var subject = "V Check with images concept";
var body = "Please find attached the completed vehicle check with images for " + vehicle_vrn + "";
MailApp.sendEmail(email_address, subject, body, {htmlBody: body, attachments: pdf});
// Delete temp file
DriveApp.getFileById(copyId).setTrashed(true);
}
我了解到您的情况如下。
- 当使用Google形式上传文件时,文件被上传到Google驱动器,像
https://drive.google.com/open?id=### fileId ###
这样的文件的URL可以被检索为事件对象。
- 在此脚本中,这样的 URL 用于从文件中检索 blob。
- 假设从你的问题和你的脚本来看,你要替换的图片的位置和数量如下。
- 有
keyVrn
、keyFrontdesc
、keyFrontimage
、keyReardesc
、keyRearimage
、keyDriversdesc
、keyDriversimage
、keyPassdesc
和 keyPassimage
在文档中。而且每个值只有一个。
front_image
、rear_image
、driver_image
和passenger_image
是上传的文件。您要将 keyFrontimage
、keyRearimage
、keyDriversimage
和 keyPassimage
替换为它们。
- 您想将包含替换文本和图像的文档作为 PDF 文件发送。
如果我的理解是正确的,这个修改怎么样?我认为您的情况有几个答案。所以请将此视为其中之一。
修改点:
- 尽管可以使用
replaceText()
替换文本值,但无法使用它替换为图像。所以我为此使用了以下流程。
- 使用 findText() 查找要替换的文本值。
- 使用 setText() 删除文本。
- 使用 insertInlineImage() 将图像插入已删除的文本。
反映以上几点的脚本如下
修改脚本:
// Get template from Google Docs and name it
var docTemplate = "doc ID";
var docName = "Vehicle check with images";
function onFormSubmit(e) {
var replaceTextToImage = function(body, searchText, fileId) {
var blob = DriveApp.getFileById(fileId).getBlob();
var r = body.findText(searchText).getElement();
r.asText().setText("");
r.getParent().asParagraph().insertInlineImage(0, blob);
}
//Get information from form and set as variables
var email_address = "myemailaddress@here.com";
var vehicle_vrn = e.values[1];
var front_desc = e.values[2];
var front_image = e.values[3].split("=")[1];
var rear_desc = e.values[4];
var rear_image = e.values[5].split("=")[1];
var driver_desc = e.values[6];
var driver_image = e.values[7].split("=")[1];
var passenger_desc = e.values[8];
var passenger_image = e.values[9].split("=")[1];
// Get document template, copy it as a new temp doc, and save the Doc’s id
var copyId = DriveApp.getFileById(docTemplate)
.makeCopy(docName+' for '+vehicle_vrn)
.getId();
// Open the temporary document
var copyDoc = DocumentApp.openById(copyId);
// Get the document’s body section
var copyBody = copyDoc.getBody();
copyBody.replaceText('keyVrn', vehicle_vrn);
copyBody.replaceText('keyFrontdesc', front_desc);
replaceTextToImage(copyBody, 'keyFrontimage', front_image);
copyBody.replaceText('keyReardesc', rear_desc);
replaceTextToImage(copyBody, 'keyRearimage', rear_image);
copyBody.replaceText('keyDriversdesc', driver_desc);
replaceTextToImage(copyBody, 'keyDriversimage', driver_image);
copyBody.replaceText('keyPassdesc', passenger_desc);
replaceTextToImage(copyBody, 'keyPassimage', passenger_image);
copyDoc.saveAndClose();
var pdf = DriveApp.getFileById(copyId).getAs("application/pdf");
var subject = "sample attachment file";
var body = "sample text: " + vehicle_vrn + "";
MailApp.sendEmail(email_address, subject, body, {htmlBody: body, attachments: pdf});
DriveApp.getFileById(copyId).setTrashed(true);
}
参考资料:
如果我误解了你的问题,请告诉我。我想修改一下。
编辑:
当您要调整插入图片的大小时,请按如下方式修改。在此修改中,图像被转换为 300 像素。请根据您的情况进行修改。
发件人:
var replaceTextToImage = function(body, searchText, fileId) {
var blob = DriveApp.getFileById(fileId).getBlob();
var r = body.findText(searchText).getElement();
r.asText().setText("");
r.getParent().asParagraph().insertInlineImage(0, blob);
}
收件人:
var replaceTextToImage = function(body, searchText, fileId) {
var width = 300; // Please set this.
var blob = DriveApp.getFileById(fileId).getBlob();
var r = body.findText(searchText).getElement();
r.asText().setText("");
var img = r.getParent().asParagraph().insertInlineImage(0, blob);
var w = img.getWidth();
var h = img.getHeight();
img.setWidth(width);
img.setHeight(width * h / w);
}
我一直在努力寻找这个问题的答案......
我有一个 google 表格(对于这个例子,我要说它是车辆的检查清单)。所以我填写表格,答案转到 sheet,sheet 中的应用程序脚本制作文档模板的副本,替换关键字,然后保存并通过电子邮件发送 pdf。这绝对没问题。
我正在尝试添加通过表单上传图片作为一些答案。图像上传到驱动器正常,但我不知道在应用程序脚本中放入什么以使图像嵌入到文档中,以便图像出现在通过电子邮件发送的 pdf 中。现在它只是为图像提供一个驱动器 link。我希望我说得有道理。
// Get template from Google Docs and name it
var docTemplate = "doc ID";
var docName = "Vehicle check with images";
// When Form Gets submitted
function onFormSubmit(e) {
//Get information from form and set as variables
var email_address = "myemailaddress@here.com";
var vehicle_vrn = e.values[1];
var front_desc = e.values[2];
var front_image = e.values[3];
var rear_desc = e.values[4];
var rear_image = e.values[5];
var driver_desc = e.values[6];
var driver_image = e.values[7];
var passenger_desc = e.values[8];
var passenger_image = e.values[9];
// Get document template, copy it as a new temp doc, and save the Doc’s id
var copyId = DriveApp.getFileById(docTemplate)
.makeCopy(docName+' for '+vehicle_vrn)
.getId();
// Open the temporary document
var copyDoc = DocumentApp.openById(copyId);
// Get the document’s body section
var copyBody = copyDoc.getActiveSection();
// Replace place holder keys,in our google doc template
copyBody.replaceText('keyVrn', vehicle_vrn);
copyBody.replaceText('keyFrontdesc', front_desc);
copyBody.replaceText('keyFrontimage', front_image);
copyBody.replaceText('keyReardesc', rear_desc);
copyBody.replaceText('keyRearimage', rear_image);
copyBody.replaceText('keyDriversdesc', driver_desc);
copyBody.replaceText('keyDriversimage', driver_image);
copyBody.replaceText('keyPassdesc', passenger_desc);
copyBody.replaceText('keyPassimage', passenger_image);
// Save and close the temporary document
copyDoc.saveAndClose();
// Convert temporary document to PDF
var pdf = DriveApp.getFileById(copyId).getAs("application/pdf");
// Attach PDF and send the email
var subject = "V Check with images concept";
var body = "Please find attached the completed vehicle check with images for " + vehicle_vrn + "";
MailApp.sendEmail(email_address, subject, body, {htmlBody: body, attachments: pdf});
// Delete temp file
DriveApp.getFileById(copyId).setTrashed(true);
}
我了解到您的情况如下。
- 当使用Google形式上传文件时,文件被上传到Google驱动器,像
https://drive.google.com/open?id=### fileId ###
这样的文件的URL可以被检索为事件对象。- 在此脚本中,这样的 URL 用于从文件中检索 blob。
- 假设从你的问题和你的脚本来看,你要替换的图片的位置和数量如下。
- 有
keyVrn
、keyFrontdesc
、keyFrontimage
、keyReardesc
、keyRearimage
、keyDriversdesc
、keyDriversimage
、keyPassdesc
和keyPassimage
在文档中。而且每个值只有一个。 front_image
、rear_image
、driver_image
和passenger_image
是上传的文件。您要将keyFrontimage
、keyRearimage
、keyDriversimage
和keyPassimage
替换为它们。
- 有
- 您想将包含替换文本和图像的文档作为 PDF 文件发送。
如果我的理解是正确的,这个修改怎么样?我认为您的情况有几个答案。所以请将此视为其中之一。
修改点:
- 尽管可以使用
replaceText()
替换文本值,但无法使用它替换为图像。所以我为此使用了以下流程。- 使用 findText() 查找要替换的文本值。
- 使用 setText() 删除文本。
- 使用 insertInlineImage() 将图像插入已删除的文本。
反映以上几点的脚本如下
修改脚本:
// Get template from Google Docs and name it
var docTemplate = "doc ID";
var docName = "Vehicle check with images";
function onFormSubmit(e) {
var replaceTextToImage = function(body, searchText, fileId) {
var blob = DriveApp.getFileById(fileId).getBlob();
var r = body.findText(searchText).getElement();
r.asText().setText("");
r.getParent().asParagraph().insertInlineImage(0, blob);
}
//Get information from form and set as variables
var email_address = "myemailaddress@here.com";
var vehicle_vrn = e.values[1];
var front_desc = e.values[2];
var front_image = e.values[3].split("=")[1];
var rear_desc = e.values[4];
var rear_image = e.values[5].split("=")[1];
var driver_desc = e.values[6];
var driver_image = e.values[7].split("=")[1];
var passenger_desc = e.values[8];
var passenger_image = e.values[9].split("=")[1];
// Get document template, copy it as a new temp doc, and save the Doc’s id
var copyId = DriveApp.getFileById(docTemplate)
.makeCopy(docName+' for '+vehicle_vrn)
.getId();
// Open the temporary document
var copyDoc = DocumentApp.openById(copyId);
// Get the document’s body section
var copyBody = copyDoc.getBody();
copyBody.replaceText('keyVrn', vehicle_vrn);
copyBody.replaceText('keyFrontdesc', front_desc);
replaceTextToImage(copyBody, 'keyFrontimage', front_image);
copyBody.replaceText('keyReardesc', rear_desc);
replaceTextToImage(copyBody, 'keyRearimage', rear_image);
copyBody.replaceText('keyDriversdesc', driver_desc);
replaceTextToImage(copyBody, 'keyDriversimage', driver_image);
copyBody.replaceText('keyPassdesc', passenger_desc);
replaceTextToImage(copyBody, 'keyPassimage', passenger_image);
copyDoc.saveAndClose();
var pdf = DriveApp.getFileById(copyId).getAs("application/pdf");
var subject = "sample attachment file";
var body = "sample text: " + vehicle_vrn + "";
MailApp.sendEmail(email_address, subject, body, {htmlBody: body, attachments: pdf});
DriveApp.getFileById(copyId).setTrashed(true);
}
参考资料:
如果我误解了你的问题,请告诉我。我想修改一下。
编辑:
当您要调整插入图片的大小时,请按如下方式修改。在此修改中,图像被转换为 300 像素。请根据您的情况进行修改。
发件人:
var replaceTextToImage = function(body, searchText, fileId) {
var blob = DriveApp.getFileById(fileId).getBlob();
var r = body.findText(searchText).getElement();
r.asText().setText("");
r.getParent().asParagraph().insertInlineImage(0, blob);
}
收件人:
var replaceTextToImage = function(body, searchText, fileId) {
var width = 300; // Please set this.
var blob = DriveApp.getFileById(fileId).getBlob();
var r = body.findText(searchText).getElement();
r.asText().setText("");
var img = r.getParent().asParagraph().insertInlineImage(0, blob);
var w = img.getWidth();
var h = img.getHeight();
img.setWidth(width);
img.setHeight(width * h / w);
}