~/home of geeks

GiroCodes mit Google Docs und goQR.me

· 400 Wörter · 2 Minute(n) Lesedauer

Vor Kurzem hatte ich einen Artikel über die Erstellung von GiroCodes in Google Docs geschrieben. Leider ist die verwendete Chart-API von Google nicht stabil, weswegen ich auf goqr.me umgestiegen bin.

Beim Generieren meiner letzten Rechnungen mit GiroCodes erhielt ich 500er-Server-Fehler von der Google-Chart-API. Die API ist seit 2019 als veraltet markiert und wird nicht mehr weiterentwickelt, funktionierte aber im letzten Jahr problemlos, insbesondere für meine Zwecke. Im Moment scheint sie aber Probleme zu haben.

Bei der Suche nach einer Alternative stieß ich auf den kostenlosen Dienst von goqr.me, eine Website, die QR-Codes generiert. Die API ist recht einfach strukturiert und ich konnte meine Beispiele aus dem letzten Artikel leicht modifiziert weiter verwenden.

Die alte Methode für das Einbinden des GiroCodes in Google Docs sah so aus:

const document = DocumentApp.openById(myId);
const documentBody = document.getBody();
insertGiroCode(copyBody, invoiceTotalBrutto, invoiceId);

function insertGiroCode(documentBody, paymentAmount, invoiceId) {
  const element = documentBody.findText("{{qrCode}}").getElement();
  if (element != null) {
    const sourceImageSize = 170;
    const imageSize = 95;
    const url = "https://chart.googleapis.com/chart?" +
        "chld=" + encodeURIComponent("L|0") + 
        "&chs=" + sourceImageSize + "x" + sourceImageSize + 
        "&cht=qr" +
        "&chl=" + encodeURIComponent(generateGiroCode(paymentAmount, invoiceId));
    Logger.log("GiroCode-URL: " + url);
    try{
      const image = UrlFetchApp.fetch(url);
      const imageBlob = image.getBlob();
      var inlineImage = element.getParent().asParagraph().insertInlineImage(1, imageBlob);
      element.removeFromParent();
      inlineImage.setWidth(imageSize);
      inlineImage.setHeight(imageSize);
    }
    catch(error){
      Logger.log("Fehler beim Abruf der QR-Code-URL: " + url);
      Logger.log(error);
      documentBody.replaceText("{{qrCode}}", "");
    }
  }
}

Ich restrukturierte den Code, um die URL für den QR-Code aus der Methode auszulagern:

function insertGiroCode(documentBody, paymentAmount, invoiceId) {
  const element = documentBody.findText("{{qrCode}}").getElement();
  if (element != null) {
    const sourceImageSize = 170;
    const imageSize = 95;
    const url = generateQrCodeUrl(sourceImageSize, generateGiroCode(paymentAmount, invoiceId));
    Logger.log("GiroCode-URL: " + url);
    try{
      const image = UrlFetchApp.fetch(url);
      const imageBlob = image.getBlob();
      var inlineImage = element.getParent().asParagraph().insertInlineImage(1, imageBlob);
      element.removeFromParent();
      inlineImage.setWidth(imageSize);
      inlineImage.setHeight(imageSize);
    }
    catch(error){
      Logger.log("Fehler beim Abruf der QR-Code-URL: " + url);
      Logger.log(error);
      documentBody.replaceText("{{qrCode}}", "");
    }
  }
}
function generateQrCodeUrl(sourceImageSize, data) {
  const url = "https://chart.googleapis.com/chart?chld=" + encodeURIComponent("L|0") + "&chs=" + sourceImageSize + "x" + sourceImageSize + "&cht=qr&chl=" + encodeURIComponent(data);
  return url;
}

Anschließend überschrieb ich die Methode generateQrCodeUrl mit einer Version, welche die URL für goqr.me generiert:

function generateQrCodeUrl(sourceImageSize, data) {
  const url = "https://api.qrserver.com/v1/create-qr-code/?size=" + sourceImageSize + "x" + sourceImageSize + "&data=" + encodeURIComponent(data)+"&ecc=M";
  return url;
}

Vielen Dank übrigens an dieser Stelle für die Betreiber von goqr.me, Foundata GmbH, die eine kostenlose API anbieten, die auch noch sehr schnell und sehr gut konfigurierbar ist.