Вставка изображения в Google Doc с помощью скрипта apps сообщает о недопустимых данных изображения - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь вставить все изображения из папки Google Drive в документ Google. Но на insertImage я всегда получаю ошибку «неверные данные изображения».

function myFunction() {
  var folder = DriveApp.getFolderById(id);
  var files = folder.getFiles();
  while (files.hasNext()) {
     var file = files.next();
     var img = file.getBlob();
     var imgDoc = DocumentApp.getActiveDocument().getBody().insertImage(0, img);  
   }
}

Есть множество примеров, которые объясняют, как это сделать, и все говорят, чтобы получить блоб изображения и использовать его для вставки. Есть ли что-то в этом коде, что дает неправильный блоб изображения?

1 Ответ

2 голосов
/ 04 апреля 2019

Как насчет этого ответа?

Гипотеза и эксперимент:

Из моего эксперимента в электронной таблице, когда изображение вставляется с помощью insertImage() в таблице классов, ограничение связано с областью изображения (в пикселях ^ 2), а не с размером его файла , Максимальная площадь изображения, которое можно вставить, составляет 1 048 576 пикселей ^ 2. Ref

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

  • Можно вставить изображение следующих размеров.

    • 5000 пикселей x 5000 пикселей
    • 25000 пикселей x 1000 пикселей
    • 1000 пикселей x 25000 пикселей
  • Нельзя вставить изображение следующих размеров.

    • 5001 пикселей x 5001 пикселей
    • 5000 пикселей x 5001 пикселей
    • 5001 пикселей x 5000 пикселей

В результате было установлено, что ограничение области составляет 25 000 000 пикселей ^ 2.

О вашей проблеме:

В вашем случае размер общего изображения составляет 6240 x 4160 пикселей. Эта область составляет 25 958 400 пикселей ^ 2. Эта область больше, чем значение (25 000 000 пикселей ^ 2), полученное выше эксперимента. При этом считается, что ошибка возникает.

Обход:

Чтобы обойти это ограничение, как насчет этого обходного пути? В этом временном решении, когда размер изображения превышает 25 000 000 пикселей ^ 2, размер изображения уменьшается с помощью Drive API. Модифицированный скрипт выглядит следующим образом.

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

function myFunction() {
  var folder = DriveApp.getFolderById(id);
  var files = folder.getFiles();
  while (files.hasNext()) {
     var file = files.next();
     var img = file.getBlob();

     // --- Following script was added.
     var url = "https://www.googleapis.com/drive/v3/files/" + file.getId() + "?fields=imageMediaMetadata(height%2Cwidth)%2CthumbnailLink&access_token=" + ScriptApp.getOAuthToken();
     var res = UrlFetchApp.fetch(url).getContentText();
     var obj = JSON.parse(res);
     if (obj.imageMediaMetadata && (obj.imageMediaMetadata.width * obj.imageMediaMetadata.height) > 25000000) {
       var width = 1000;
       var tlink = obj.thumbnailLink.replace(/=s\d+/, "=s" + width);
       img = UrlFetchApp.fetch(tlink).getBlob();
     }
     // ---

     var imgDoc = DocumentApp.getActiveDocument().getBody().insertImage(0, img);
   }
}
  • В этой модификации, в качестве примера, размер изображения уменьшен с шириной 1000 пикселей. Если вы хотите изменить это, пожалуйста, измените var width = 1000.
  • Я думаю, что в вашем скрипте Drive API уже был автоматически включен, потому что используется класс DriveApp. Но если возникает ошибка, связанная с Drive APi, проверьте, включен ли Drive API на консоли API.

Ссылки:

...