Скрипт Google Sheets Apps> Поиск коэффициента изображения

Я использую язык сценариев Google листов, и я хочу получить соотношение изображения по веб-ссылке, например, этот флаг.

Я видел способ сделать это здесь, но я хочу вернуть соотношение из функции, а не поместить ее в случайную ячейку.

До сих пор мне удалось получить это, которое, кажется, не работает.

function imageSize(imgUrl) {
  if  (typeof imgUrl == 'undefined') {
    imgUrl = 'http://www.google.com/intl/en_ALL/images/logo.gif';
  }
  PropertiesService.getScriptProperties().setProperty('ratio', 0);

  var t = '';     
  t += '<script>\n';
  t += 'function hd(){\n';
  t += 'var img = new Image();\n';
  t += 'img.onload = function() {\n';
  t += "google.script.run.returnVal(this.width / this.height);\n";
  t += '}\n';
  t += "img.src = '" + imgUrl + "';\n";
  t += '}\n';
  t += 'google.script.run.withSuccessHandler(google.script.host.close)\n';
  t += '.returnVal(hd());\n';
  t += '</script>\n';  


  var output = HtmlService.createHtmlOutput(t);
  // output.setSandboxMode(HtmlService.SandboxMode.IFRAME); 
  // SpreadsheetApp.getUi().showModalDialog(output,'please, wait...');
  // output.clear();
  Utilities.sleep(2000);
  return PropertiesService.getScriptProperties().getProperty('ratio');;
}


function returnVal(h) {
  Logger.log(h);
  PropertiesService.getScriptProperties().setProperty('ratio', h);
  return h;
}

1 ответ

Решение

Как насчет этого обходного пути? Я думаю, что есть несколько ответов для вашей ситуации. Поэтому, пожалуйста, подумайте об этом как об одном из них. Ход этого сценария выглядит следующим образом.

  1. Загрузите изображение в виде файла.
  2. Извлеките imageMediaMetadata из загруженного файла с помощью Drive API.
  3. Удалить загруженный файл.
  4. Получить соотношение сторон из imageMediaMetadata.

Чтобы использовать этот пример сценария, включите Drive API в консоли Advanced Google Services и API следующим образом.

Включить Drive API v2 в расширенных службах Google

  • В редакторе сценариев
    • Ресурсы -> Расширенные услуги Google
    • Включить Drive API v2

Включить Drive API на консоли API

  • В редакторе сценариев
    • Ресурсы -> Проект облачной платформы
    • Просмотр API консоли
    • В начале работы нажмите Включить API и получите учетные данные, например ключи.
    • С левой стороны, нажмите Библиотека.
    • В поле Поиск API и сервисов введите "Драйв". И нажмите Drive API.
    • Нажмите кнопку Включить.
    • Если API уже включен, пожалуйста, не выключайте.

Пример сценария

function myFunction(url) {
  var blob = UrlFetchApp.fetch(url).getBlob();
  var fileId = DriveApp.createFile(blob).getId();
  var imageMediaMetadata = Drive.Files.get(fileId).imageMediaMetadata;
  var aspectRatio = imageMediaMetadata.width / imageMediaMetadata.height;
  Drive.Files.remove(fileId);
  return aspectRatio;
}

Замечания:

  • когда https://www.theodora.com/flags/e_timor.gif в вашем вопросе используется для этого сценария, 1.5 получается

Рекомендации:

Если это было не то, что вы хотите, извините.

Добавлено:

Если вы не хотите создавать файлы на Google Диске, вы можете получить соотношение сторон, используя эту библиотеку. Эта библиотека может извлечь размер изображения из большого двоичного объекта, поскольку двоичные данные изображения анализируются. Когда эта библиотека используется для вашей ситуации, сценарий становится следующим.

function myFunction(url) {
  var blob = UrlFetchApp.fetch(url).getBlob();
  var res = ImgApp.getSize(blob);
  var aspectRatio = res.width / res.height;
  return aspectRatio;
}
Другие вопросы по тегам