Найти googleusercontent.com URL для InlineImage - PullRequest
0 голосов
/ 07 февраля 2019

Каждый раз, когда я загружаю изображение (например, InlineImage) в Документ Google, оно загружает его в CDN и ссылается на URL-адрес googleusercontent.com.Если я использую скрипт Google Apps в DocumentApp, я могу получить экземпляр InlineImage.Я знаю, что могу преобразовать его в base64, а затем создать URL-адрес данных для этого изображения.Однако вместо создания этого гигантского URL-адреса лучше использовать существующий URL-адрес googleusercontent.com.

Как узнать URL-адрес googleusercontent.com для InlineImage?

1 Ответ

0 голосов
/ 07 февраля 2019

По сути, вам нужно сделать следующее:

  1. Установить уникальное описание alt на InlineImage.
  2. Получить HTML-код всего документа .
  3. Используйте регулярное выражение, чтобы найти тег <img, используя уникальное описание alt из шага 1.

function getUrlOfInlineImage(inlineImage) {
  var altDescription = inlineImage.getAltDescription(); // warning: assumes that the alt description is a uuid. If it's not unique, this function might return a different image's url. If it's not a UUID, it might contain illegal regex characters and crash.
  if (!altDescription) {
    inlineImage.setAltDescription(Utilities.getUuid());
    // TODO: We currently crash because if we attempt to get the HTML right after calling setAltDescription(), it won't exist in the HTML. We must wait a bit of time before running it again. If there was something like DocumentApp.flush() (similar to how the Spreadsheet App has the same function), it might resolve this issue and we wouldn't need to crash.
    throw "Image was missing an alt description. Run again."
  }

  var html = getGoogleDocumentAsHTML();
  var regex = new RegExp('<img alt="' + altDescription + '" src="([^"]+)"');
  var matches = regex.exec(html);
  if (matches) {
    return matches[1];
  } else {
    return null;
  }
}

function getGoogleDocumentAsHTML() {
  var id = DocumentApp.getActiveDocument().getId() ;
  var forDriveScope = DriveApp.getStorageUsed(); //needed to get Drive Scope requested
  var url = "https://docs.google.com/feeds/download/documents/export/Export?id="+id+"&exportFormat=html";
  var param = {
    method      : "get",
    headers     : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
    muteHttpExceptions:true,
  };
  var html = UrlFetchApp.fetch(url,param).getContentText();
  return html;
}

Очевидно, что есть возможность для улучшениясценария (например, не приводил к сбою), но этого было достаточно для моего варианта использования.

...