본문 바로가기
WeekdayLife/excel

[구글시트] Sheets로 이미지 URL의 EXIF 정보 얻어내기

by JO_i 2023. 7. 24.

Sheets로 이미지 URL의 EXIF 정보 얻어내기

아래 그림처럼 플러터에서 이미지를 띄워주고, 하단에 EXIF 정보를 표기하고 싶다.

 

 

 

 

전제사항

DB를 Sheets에 저장했다. 즉, 이미지는 별도의 웹에 올려져 있고, 이미지 경로만 있는 셈이다.

 

EXIF 정보를 보기하는 방법은 두가지로, 플러터에서 이미지를 호출, bytecode로 변환, EXIF 정보추출하는 방법과 Sheets에서 미리 EXIF 정보를 추출 각 컬럼에 정보를 기재하는 방식이다.

 

플러터에서 추출하는 첫번째 방법은 이미지를 호출하는 것과 맞물려서, 퍼포먼스에 악영향을 줄 것이기 때문에 배제가 되었다. 두번째 방법은 Sheets의 appscript를 활용하여, EXIF 정보를 받아오는 방식으로 사전에 한번만 해놓으면 DB에 값이 들어가기 때문에, 플러터 앱 구동 시점에 무리가 전혀 없을 것이다.

 

정리가 된다면 Sheets 상의 DB테이블은 아래 이미지처럼 될 것이다. 

 

 

 

EXIF 호출

그럼, appscript를 고민할 차례. 구글링을 통해 개발새발 노가다로 짜깁기를 한 결과는 아래와 같다.

function getExifDataFromUrl() {
  var app = SpreadsheetApp.getActiveSpreadsheet();
  var o_sht = app.getSheetByName("gal");

  for (let r = 1; r < o_sht.getLastRow() + 1; r++) {
    Logger.log(r);

    if (o_sht.getRange(r, 6).getValue() == "") {
      if (o_sht.getRange(r, 1).getValue() == "img") {
        var url = o_sht.getRange(r, 3).getValue();
        o_sht.getRange(r, 6).setValue(getExifData(url)[0]);
        o_sht.getRange(r, 7).setValue(getExifData(url)[1]);
        o_sht.getRange(r, 8).setValue(getExifData(url)[2]);
      } else {
        if (r >= 2) {
          o_sht.getRange(r, 6).setValue("-");
          o_sht.getRange(r, 7).setValue("-");
          o_sht.getRange(r, 8).setValue("-");
        }
      }
    }
  }
}

function getExifData(imageUrl) {
  var response = UrlFetchApp.fetch(imageUrl, {
    headers: { "Contents-Type": "img/jpeg" },
  });
  var fileBlob = response.getBlob();
  var res = Drive.Files.insert({ title: "temp" }, fileBlob);
  var meta = res.imageMediaMetadata;
  Drive.Files.remove(res.id);

  return [meta.cameraModel, meta.lens, meta.aperture];
}

 

생각보다, 잘 되서 석연치 않기는 하지만, 좀 오래 걸리긴 하는데, 음.. 뭘 걷어내야할지는 잘 모르겠다.

 

끝.