如何解决成功生成 PDF,但添加二维码时失败
我有谷歌表单,如下表(电子表格)所示。
此脚本无法生成二维码。标题中的二维码公式,因此它会自动在B列的电子表格中使用D列的数据生成二维码。我不知道如何解决。
var docTemplate = "doc ID";
var docName = "Vehicle check with images";
function onFormSubmit(e) {
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);
}
//Get information from form and set as variables
var email_address = "myemailaddress@here.com";
var qrCode = e.values[1].split("=")[3];//I want to try
var empName = e.values[2];
var empId = e.values[3];
var photo = e.values[4].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 '+empName)
.getId();
// Open the temporary document
var copyDoc = DocumentApp.openById(copyId);
// Get the document’s body section
var copyBody = copyDoc.getBody();
replaceTextToImage(copyBody,'qrcode',qrCode);//problem could not be generated
copyBody.replaceText('name',empName);
copyBody.replaceText('id',empId);
replaceTextToImage(copyBody,'photo',photo);
copyDoc.saveAndClose();
var pdf = DriveApp.getFileById(copyId).getAs("application/pdf");
var subject = "sample attachment file";
var body = "sample text: " + empName + "";
MailApp.sendEmail(email_address,subject,body,{htmlBody: body,attachments: pdf});
DriveApp.getFileById(copyId).setTrashed(true);
}
时间戳 | ={"QR CODE";ARRAYFORMULA(IF(D2:D"";IMAGE("https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl="&D2:D);) )} | 姓名 | ID | 照片 |
---|---|---|---|---|
10/07/2021 8:35:24 | 二维码 | 罗伯特 | 1234 | https://drive.google.com/open?id=14SAL5EK8tqOESgZyAayScbTqhSEE89Wa |
解决方法
我没能重现这个问题。我或多或少地重复了所有步骤,它按预期工作。这是最小的可重现示例。
const doc_template_ID = 'template ID';
const ss_ID = 'spreadsheet ID';
const email_address = 'mail@gmail.com';
function make_doc_and_send_it_as_pdf() {
// get data from spreadsheet
const sheet = SpreadsheetApp.openById(ss_ID).getSheets()[0];
const QR_text = sheet.getRange('B1').getValue();
// make copy of the template and make changes in the doc
const doc_file = DriveApp.getFileById(doc_template_ID).makeCopy('QR_code');
const doc_ID = doc_file.getId()
const doc = DocumentApp.openById(doc_ID);
var body = doc.getBody();
body = body.replaceText('{{text}}',QR_text);
// insert a pic of the QR code
const url = "https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=" + QR_text;
const resp = UrlFetchApp.fetch(url);
const image = resp.getBlob();
replaceTextToImage(body,'{{QR}}',image);
doc.saveAndClose();
// send the doc via email as pdf
var pdf = doc_file.getAs("application/pdf");
var subject = "QR pdf";
var body = "sample text";
MailApp.sendEmail(email_address,subject,body,{htmlBody: body,attachments: pdf});
doc_file.setTrashed(true);
}
// modified Tataike's function from here
// https://tanaikech.github.io/2018/08/20/replacing-text-to-image-for-google-document-using-google-apps-script/
// now it takes image (blob) instead of fileId
function replaceTextToImage(body,searchText,image) {
var next = body.findText(searchText);
if (!next) return;
var r = next.getElement();
r.asText().setText('');
r.getParent().asParagraph().insertInlineImage(0,image);
return next;
};
我的电子表格如下所示:
我的文档模板如下所示:
电子邮件中的 PDF 如下所示:
它从电子表格中获取数据,制作文档模板的副本,更改文档中的文本,在文档中插入二维码图像(它替换了所有包含“{{QR}}”的段落,我将其保留为是的,可能它可以只替换段落中的一个词)),并通过邮件以 PDF 格式发送文档。
在您的代码中,您可能需要以这种方式更改函数 replaceTextToImage()
:
var replaceTextToImage = function(body,blob) {
var width = 300; // Please set this.
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);
}
它使函数采用 blob
而不是 fileId
。
并更改这两行:
var qrCode = e.values[3].split("=")[1];
var photo = e.values[4].split("=")[1];
这样:
var qrCode = UrlFetchApp.fetch(e.values[3].split("=")[1]).getBlob();
var photo = DriveApp.getFileById(e.values[4].split("=")[1]).getBlob();
我假设 e.values[3].split("=")[1]
包含二维码文本,e.values[4].split("=")[1]
包含文件 ID。但我可能是错的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。