Como obtener el tamaño de imágenes con Google Apps Script

Puede haber ocasiones en que obtener el tamaño de imágenes usando Google Apps Script puede ser extremadamente útil para automatizar tareas, el problema es que esto es bastante difícil de conseguir (te reto a que lo encuentres :) ).  Aunque me ha costado bastante he conseguido desarrollar un manera de hacerlo y que me permite ahorra bastante tiempo diario al calcular los tamaños de grupos de imágenes.

He montado un spreadsheet con esta estructura, donde puedes poner la lista de url a las imagenes y al ejecutar el script se rellenan el height y el width de la imagen gracias a la magia de Google Apps Script.
como calcular tamaño de una imagen con Google Apps Script


Como conseguirlo?
En este caso concreto, el gran problema no es saber programar, sino encontrar la manera de poder obtener la información que queremos. Desde Google Apps Script es IMPOSIBLE conseguirlo directamente, no hay herramienta que te lo permita, pero, desde JavaScript si que es factible saber el tamaño de una imagen.

El código para saber el tamaño de una imagen con JavaScript seria tal que así:
function GetImagesize()
{
	var img = new Image();
	img.addEventListener("load", function()
            {
               var url = this.currentSrc;
               var width  = this.naturalWidth;
               var height = this.naturalHeight; 
		//Aqui hacemos lo queramos con ese tamaño	
            });
	img.src = url_de_tu_imagen;
}

Básicamente, creamos un objeto de tipo imagen (una de las pocas cosas de JavaScript que no podemos hacer en Google Apps Script), le marcamos que cuando la imagen este cargada obtenga el tamaño de la imagen correspondiente y le damos la url de la imagen a cargar.

Tal como hemos dicho esto no puede hacerse en Google Apps Script, pero... desde Google Apps Script si que podemos servir una web que use JavaScript. Es más, podemos hacer que esta web esta embedida dentro de un popup en un spreadsheet, de forma que cuando llamemos a este popup desde nuestro spreadsheet se realice todo el proceso de obtención de tamaños de imágenes. 

Ahora el problema que tendremos es que la obtención de los tamaños de las imágenes se producirá de forma asíncrona (se obtendrá cuando la imagen se haya cargado), de forma que esta información la tendremos que ir guardando hasta que no la podamos recuperar toda. La forma más fácil es usar la cache ( sessionStorage ) de JavaScript.

Finalmente solo necesitaremos transferir toda esta información desde JavaScript a Google Apps Script para poder guardarla en nuestro spreadsheet.

Como podéis ver, el proyecto es bastante más complicado de lo que parece, pero personalmente ha sido todo un orgullo poderlo completar.

Os adjunto todo el código del proyecto para que podáis ponerlo en práctica.

Espero que os sirva! 

No dudéis en hacerme llegar vuestras propuestas!

Code.gs
function onOpen()
{
  SpreadsheetApp.getUi().createMenu("SCRIPT")
          .addItem("CheckSize","CheckSize")
          .addToUi();
}

function AskForList()
{
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheeturl = spreadsheet.getActiveSheet();
  var images   = sheeturl.getRange(1,1,sheeturl.getLastRow(), 1 ).getValues();

  var elements = new Array();
  for(var i = 1 ; i < images.length ; ++i)
  {
      var url = images[i][0];
      var element = new Object();
      element.url    = url;
      elements.push(element);
  }
  return elements;
}

function ReportSizes(sizes)
{
   var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = spreadsheet.getActiveSheet();
   for(var i = 0 ; i < sizes.length ; ++i)
   {
     var size = sizes[i];
     sheet.getRange(i+2,2).setValue(size.Height);
     sheet.getRange(i+2,3).setValue(size.Width);
   }
}

function CheckSize()
{
  var html = HtmlService.createHtmlOutputFromFile('index').setWidth(100).setHeight(100);
  SpreadsheetApp.getUi().showModalDialog(html,"Image Size");
}

index.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      function getSize(url)
      {   
        var img = new Image();
        img.addEventListener("load", function()
            {
               var url = this.currentSrc;
               var width  = this.naturalWidth;
               var height = this.naturalHeight; 
               sessionStorage[url+"_width"] = width;
               sessionStorage[url+"_height"]= height;
            });
        img.src = url;
      }
      
      function ReciveDone()
      {
        document.getElementById("button").innerHTML = "<a> PROCESS END </a>";
      }

      function ReciveWaiting(list)
      {
         var errors = new Array();
         
         for(var i = 0 ; i < list.length ; ++i )
         {
            var element = list[i];
            var width  = sessionStorage[element.url+"_width"];
            var height = sessionStorage[element.url+"_height"];
            list[i].Height = height;
            list[i].Width  = width;
         }

         google.script.run.withSuccessHandler(ReciveDone).ReportSizes(list);
      }

      function ReciveList(list)
      {
         sessionStorage.clear();
         for(var i = 0 ; i < list.length ; ++i )
         {
            var element = list[i];
            getSize(element.url);
         }
         google.script.run.withSuccessHandler(ReciveWaiting).AskForList();
      }

      function AskForList()
      {
         document.getElementById("button").innerHTML = "";
         google.script.run.withSuccessHandler(ReciveList).AskForList();
      }
    </script>
  </head>
  <body>
     <div id="button">
        <input type="button" onclick="AskForList()" value="PROCEED">  
     </div>
  </body>
</html>

Tal vez te interese