如何将 Google 表格中创建的 QR 码保存为图像 api.qrserver?

How to save as image a QR codes created in Google Sheets with api.qrserver?

我正在 Google Sheet 中的一列中生成 QR 码,其中包含通过 Google 表单输入的数据,我想将它们保存为图像。

使用 Ctrl + CCtrl+V 仅在 Google Sheet 内有效并尝试复制并粘贴它sheet 之外的一个也不起作用。检测到剪贴板不包含要粘贴到其他地方的图像。

问题不在于生成二维码,而在于将其导出或另存为图像。

为了生成 QR,我正在使用 api.qrserver,但是这方面的文档仅涉及创建或读取 QR 的 [http://goqr.me/api/doc/],为此,该基础用于在技术上生成 PNG图片:

http(s)://api.qrserver.com/v1/create-qr-code/?data=[URL-encoded-text]&size=[pixels]x[pixels]

但是,如果我在 link 外部直接在单元格中使用该公式,则创建的 PNG 只会给出 Google Sheet 的 URL 地址,而不会二维码信息。

这是我在第 1 行用于生成 QR 的数组公式:

    ={"QR";arrayformula( if(                         
    len(INDIRECT("A2:A")),IMAGE("https://api.qrserver.com/v1/create-qr-        
    code/?size=120x120&data="&ENCODEURL(
    "-Tip: "&indirect("B2:B")& char(10)& 
    "-Ub: "&INDIRECT("C2:C")& char(10)& 
    "-#: "&indirect("D2:D")& char(10)&
    "-IDE: "&INDIRECT("E2:E")& char(10)& 
    "-Serial: "&INDIRECT("G2:G") & char(10)&
    "-Pa: "&indirect("H2:H") & char(10)&
    "-IP: "&INDIRECT("I2:I") & char(10)&
    "-As: "&indirect("J2:J") & char(10)&
    "-R: "&INDIRECT("K2:K") & char(10)&
    "-Ar: "&indirect("L2:L") & char(10)
    ),2)
    ,""))}

理想情况下,我想自动将 QR 制作成图像并自动将它们保存到 google 驱动器中的文件夹中。如果可能,为它们分配一个 IDE 值,该值包含在另一列以及相同的 QR 码中。

这里是 QR 生成的例子: [https://docs.google.com/spreadsheets/d/16pALQ0LNbBqqdRNNejar8zJJPPNEP8I7HSbKDOJHZaw/edit?usp=sharing]

您不能使用自定义函数并与 Google Drive 交互,在 G 脚本上使用自定义函数和 onEdit 函数访问用户数据存在限制:

https://developers.google.com/apps-script/guides/sheets/functions

据我所知,实现此目的的唯一方法是创建自定义菜单并通过菜单与自定义功能交互。

  var url = "https://api.qrserver.com/v1/create-qr-code/?data=Sample&size=128x128";
  var folders = DriveApp.getFoldersByName("QRCodeFolderName");// Put here the name of the folder inside root folder
  var folder = folders.next();
  var response = UrlFetchApp.fetch(url);
  if (response.getResponseCode() == 200){
    var fileBlob = response.getBlob();
    folder.createFile(qrcodevalue+".png",fileBlob);
  }
  • 您想使用 Google Apps 脚本将 Spreadsheet 中的二维码保存为图像文件。
    • 在这种情况下,您想在不更改 Spreadsheet 的情况下实现此目的。
  • 提交表单时,值从 "A" 列到 "L" 列。

如果我的理解是正确的,这个示例脚本怎么样?请将此视为几个答案之一。

在这个示例脚本中,QR 码直接从 api.qrserver.com 中获取,并保存为图像文件,因为在您的情况下,无法从 Spreadsheet 中获取图像。在这种情况下,二维码的所有参数都使用来自 Spreadsheet.

示例脚本:

在你运行脚本之前,请设置sheetNamefolderId的变量。当你运行这个脚本时,Hoja_calculos的sheet中的所有QR码都被创建为图像文件。

function myFunction() {
  var sheetName = "Hoja_calculos"; // Sheet name is from your shared Spreadsheet.
  var folderId = "###"; // Folder ID of the folder where the image files are created.

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetName);
  var url = "https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=";
  var keys = ["-Tipo:", "-Ubicación:", "-# registro:", "-ID-C:", "-# Serial:", "-Pas:", "-Di I:", "-Asi:", "-RP:", "-Ar:"];
  var values = sheet.getRange(2, 2, sheet.getLastRow() - 1, 11).getValues()
    .filter(function(e) {return e.some(function(f) {return f})})
    .map(function(row) {
      row.splice(4, 1);
      return row;
    });
  var length = values.length;


//  values = [values.pop()]; // If you want to save only the QR code of the last row, please use this line.


  var reqs = values.map(function(e) {return {url: url + encodeURIComponent(keys.map(function(f, j) {return f + e[j]}).join("\r"))}});
  var res = UrlFetchApp.fetchAll(reqs);
  res.forEach(function(r, i) {
    var blob = r.getBlob().setName(length == values.length ? "row" + (i + 2) + ".png" : "row" + (length + 1) + ".png");
    DriveApp.getFolderById(folderId).createFile(blob);
  });
}

注:

  • 如果只想保存最后一行的二维码,请使用这一行。届时请删除// values = [values.pop()];//。这样,只检索到最后一行的二维码。
    • 因为我觉得上面的情况可能是你的情况所需要的,所以我加上了。例如,在函数中使用可安装的触发器,在提交表单时,只创建最后一行的二维码作为图像文件。
    • 但我不确定您的表单环境。所以我不确定这是否可以用于您的情况。对此我深表歉意。
  • 我确认此脚本适用于您共享的 Spreadsheet。如果实际的 Spreadsheet 与此不同,请修改脚本,因为它可能无法正常工作。

参考文献: