getBlob () вызывает «Неверные данные изображения».Ошибка.Google Apps Script - PullRequest
0 голосов
/ 14 февраля 2019

Моя цель: 1. извлечь строку изображения base64 из документа Google 2. сохранить ее на диск как изображение 3. получить из изображения блоб и вставить новое изображение в тот же документ, что и реальное изображение.

function getImage(doc) {
    var tempBase64 = doc.getBody().getParagraphs()[doc.getBody().getParagraphs().length - 1].getText();
    var base64 = tempBase64.replace("data:image/svg+xml;base64,", "");
    var decoded = Utilities.base64Decode(base64);
    return decoded;
}

function run() {
    var doc = DocumentApp.getActiveDocument();
    var img = getImage(doc); //returns decoded blob
    var body = DocumentApp.getActiveDocument().getBody();
    //gets the name of the current doc
    var filename = DriveApp.getFileById(DocumentApp.getActiveDocument().getId());
    var blobImg = Utilities.newBlob(img, MimeType.SVG, filename);
    var currentFolder = DriveApp.getFolderById("1UuP2vZNXLVtgrZxAHLSNZUqVnx0xeSgW");
    //saves image as same name
    var newimg = currentFolder.createFile(blobImg).getId();
    //wait for image to save
    Utilities.sleep(5 * 1000);
    // get blob 
    var blob = DriveApp.getFileById(newimg).getBlob();
    var cursor = doc.getCursor();
    if (cursor) {
    //insert in to doc
        cursor.insertInlineImage(blob);
    }

}

function onOpen() {
    run();
}

В настоящее время он читает документ и извлекает строку base64 ✓ например:

image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4xIiB3aWR0aD0iMTIiIGhlaWdodD0iMTUiPjxwYXRoIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9InJnYigwLCAwLCAxMzkpIiBmaWxsPSJub25lIiBkPSJNIDEgMyBsIDEgNCIvPjxwYXRoIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9InJnYigwLCAwLCAxMzkpIiBmaWxsPSJub25lIiBkPSJNIDggMSBsIDEgMSIvPjxwYXRoIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9InJnYigwLCAwLCAxMzkpIiBmaWxsPSJub25lIiBkPSJNIDMgMTAgYyAwLjAyIDAuMDcgMC4zMSAzLjU0IDEgNCBjIDAuODQgMC41NiAzLjg5IDAuNDcgNSAwIGMgMC44IC0wLjM0IDIgLTMgMiAtMyIvPjwvc3ZnPg==

Сохраняется как изображение в определенной папке ✓

Возвращается идентификаторновое изображение. ✓

Получается изображение в виде BLOB-объекта ✓

Когда дело доходит до вставки изображения, я получаю неверные данные изображения.(строка 20, файл «Код»).Буквально не знаю, как решить.Кто-нибудь поможет?

1 Ответ

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

Я думаю, что ваш сценарий правильный.Есть только одна проблема.На данном этапе изображения с типом mimeType image/svg+xml не могут быть непосредственно вставлены в Документ Google.Так что требуется конвертировать из SVG изображения в другой MimeType.В этой модификации я конвертирую в image/png, используя Drive API.Также есть несколько API, которые не являются API Google, для преобразования SVG в другие.Я думаю, что в вашей ситуации есть несколько обходных путей.Поэтому, пожалуйста, подумайте об этом как об одном из них.

Точки изменения:

  • Извлечение идентификатора файла из созданного файла и извлечение thumbnailLink с помощью Drive API.
  • После того, как размер изображения ссылки будет откорректирован, восстановите изображение в формате PNG.
    • Уже было обнаружено, что путем изменения параметра запроса =s### можно изменить размер изображения.Я использовал это. Ссылка
  • Поместить BLOB-объект PNG в Document.

Модифицированный скрипт:

В этом модифицированном скрипте run() был изменен.Пожалуйста, подтвердите следующий измененный скрипт.

function run() {
  var doc = DocumentApp.getActiveDocument();
  var img = getImage(doc); //returns decoded blob
  var body = DocumentApp.getActiveDocument().getBody();
  //gets the name of the current doc
  var filename = DriveApp.getFileById(DocumentApp.getActiveDocument().getId());
  var blobImg = Utilities.newBlob(img, MimeType.SVG, filename);
  var currentFolder = DriveApp.getFolderById("1UuP2vZNXLVtgrZxAHLSNZUqVnx0xeSgW");
  //saves image as same name
  var newimg = currentFolder.createFile(blobImg).getId();
  //wait for image to save
  Utilities.sleep(5 * 1000);
  // get blob

  // --- Added --- Begin
  var width = 300; // width of the image. A value of 300 pixels was used as a sample.
  var url = "https://www.googleapis.com/drive/v3/files/" + newimg + "?fields=thumbnailLink&access_token=" + ScriptApp.getOAuthToken();
  var link = JSON.parse(UrlFetchApp.fetch(url).getContentText()).thumbnailLink.replace(/=s\d+/, "=s" + width);
  var blob = UrlFetchApp.fetch(link).getBlob();
  // --- Added --- End

  var cursor = doc.getCursor();
  if (cursor) {
  //insert in to doc
      cursor.insertInlineImage(blob);
  }
}

Примечание:

  • Ширина и высота изображения svg не могут быть получены с помощью Drive API.Поэтому в этой модификации я использовал постоянную ширину.
  • Я думаю, что в вашем скрипте можно использовать Drive API.Но если возникает ошибка, связанная с API, включите Drive API на консоли API.

Ссылка:

Если это не тот результат, который вы хотите, я прошу прощения.

...