如何将公式生成的二维码作为图片放入google文档中(导出为PDF)?

How to place QR code that generated by formula as image in google doc (Export to PDF)?

我使用图片函数生成了二维码 (=image("https://chart.googleapis.com/....) 并希望在导出到 google 文档后放入PDF,但它什么都不显示,我如何将 spreadsheet 中的 QRcode 作为图像放置在文档中。感谢大家的进步。

这是代码。 (仅示例)

function createBulkPDFs(e) {

  const pdfFolder = DriveApp.getFolderById("xxx");
  const tempFolder = DriveApp.getFolderById("xxx");
  const docFile = DriveApp.getFileById("xxx");
  const ws = SpreadsheetApp.openById("xxx").getSheetByName("eee");

  const range = ws.getRange(2, 1, ws.getLastRow() - 1, 6).getValues();
  var data = range[range.length - 1];
  createPDF(data[1],data[3], data[4], data[5], data[6], data[3] + "" + data[4], docFile, tempFolder, pdfFolder);
}

function createPDF(qcode, First, Last, address, quantity, pdfName, docFile, tempFolder, pdfFolder) {

  const tempFile = docFile.makeCopy(tempFolder);
  const tempDocFile = DocumentApp.openById(tempFile.getId());
  const body = tempDocFile.getBody();

  body.replaceText("{qr}", qcode);
  body.replaceText("{fn}", First);
  body.replaceText("{ln}", Last);
  body.replaceText("{addr}", address);
  body.replaceText("{qty}", quantity);
  tempDocFile.saveAndClose();

  const pdfContentBolb = tempFile.getAs("application/pdf");
  const pdfFile = pdfFolder.createFile(pdfContentBolb).setName(pdfName);
  tempFile.setTrashed(true);

  return pdfFile;}

只想将B 列作为图像放置并保存为PDF。 google sheet 这里!! Click...

我相信你的目标如下。

  • 您想使用 Google Apps 脚本将 Google 电子表格中的值复制到 Google 文档。
  • Google电子表格如下。

修改点:

  • 当我看到您的示例电子表格和脚本时,您似乎将参数发送给函数 createPDF,就像 createPDF(data[1],data[3], data[4], data[5], data[6], data[3] + "" + data[4], docFile, tempFolder, pdfFolder) 一样。
    • 电子表格的值从列“A”到“F”。但是在您的论点中,使用了 data[6] 。在这种情况下,错误发生在 body.replaceText("{qty}", quantity).
    • createPDF(qcode, First, Last, address, quantity, pdfName, docFile, tempFolder, pdfFolder)开始,我认为必须是createPDF(data[1], data[2], data[3], data[4], data[5], data[2] + "" + data[3], docFile, tempFolder, pdfFolder)
    • 如果您的实际电子表格与示例电子表格不同,则以下修改后的脚本不起作用。所以,请注意这一点。在这个答案中,我使用您的示例电子表格修改了您的脚本。
  • 为了从 =image("https://chart.googleapis.com/.... 的单元格中检索图像,我想建议使用 UrlFetchApp 检索图像 blob。关于将文本替换为图像的脚本,我使用了 中的示例脚本。
    • URL 是从公式中检索到的,data 是您检索到的。

当以上几点反映到你的脚本中,就会变成下面这样。

修改后的脚本:

在使用此脚本之前,请设置 xxx 的每个值。

function createBuikPDFs(e) {
  const pdfFolder = DriveApp.getFolderById("xxx");
  const tempFolder = DriveApp.getFolderById("xxx");
  const docFile = DriveApp.getFileById("xxx");
  const ws = SpreadsheetApp.openById("xxx").getSheetByName("eee");

  const values = ws.getRange(2, 1, ws.getLastRow() - 1, 6).getValues();
  const length = values.length;
  var data = values[length - 1];
  const formula = ws.getRange(length + 1, 2).getFormula();
  const url = formula.replace(/\=image\("/i, "").replace(/chl\="&.+/i, `chl=${data[5]}`);
  data[1] = UrlFetchApp.fetch(url).getBlob();
  createPDF(data[1], data[2], data[3], data[4], data[5], data[2] + "" + data[3], docFile, tempFolder, pdfFolder);
}

function createPDF(qcode, First, Last, address, quantity, pdfName, docFile, tempFolder, pdfFolder) {

  // This function is from 
  var replaceTextToImage = function (body, searchText, image, width) {
    var next = body.findText(searchText);
    if (!next) return;
    var r = next.getElement();
    r.asText().setText("");
    var img = r.getParent().asParagraph().insertInlineImage(0, image);
    if (width && typeof width == "number") {
      var w = img.getWidth();
      var h = img.getHeight();
      img.setWidth(width);
      img.setHeight(width * h / w);
    }
    return next;
  };

  const tempFile = docFile.makeCopy(tempFolder);
  const tempDocFile = DocumentApp.openById(tempFile.getId());
  const body = tempDocFile.getBody();

  replaceTextToImage(body, "{qr}", qcode);
  body.replaceText("{fn}", First);
  body.replaceText("{ln}", Last);
  body.replaceText("{addr}", address);
  body.replaceText("{qty}", quantity);
  tempDocFile.saveAndClose();

  const pdfContentBolb = tempFile.getAs("application/pdf");
  const pdfFile = pdfFolder.createFile(pdfContentBolb).setName(pdfName);
  tempFile.setTrashed(true);

  return pdfFile;
}

注:

  • 在此修改后的脚本中,使用了您的示例电子表格。请注意这一点。

参考文献: