LoginSignup
5
4

More than 1 year has passed since last update.

GASで画像をbase64でエンコード

Last updated at Posted at 2019-11-18

注意

仕様変更によりスプレッドシートがGoogleドライブの容量にカウントされるようになりました。
エンコードするとサイズが大きくなるので、基本的にはおすすめできないです。
画像で検索してもヒットしないので、隠すことくらいしか利点が無さそうです。

目的

GASでする意味あるの?というのは当然の疑問ですが勿論あります。
なんとスプレッドシートはGoogleDriveの容量を使わないんです。
つまり、実質無制限ということです。
画像以外にも使えます。
まぁ欠点はデコードするのが手間だというくらい。
というかそれしかない。
GASでHTML作ってそこにimgタグ入れて一応見れるようにしてるけど実用性はあんまり。
今は使わないけどもしかしたら今後必要になるかも、一応バックアップ取っておこうッていうのに役立つと思います。

コード

スプレッドシートを用意してA1から右方向に[ファイルの名前、サイズ、タグ、エンコードした文字列]を想定しています。
tagは手動でつけてください。
画像はフォルダを作ってそこに入れておいてください。
エンコードしてらゴミ箱に入れるようにしています。

code.js
function encode_img(){
  
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
  const folderId = PropertiesService.getScriptProperties().getProperty('folderId');
  const folder = DriveApp.getFolderById(folderId);
  const files = folder.getFiles();
  var file;
  var file_name;
  var blob;
  var encoded;
  var file_size;
  
  while(files.hasNext()) {
    file = files.next();
    file_name = file.getName();
    file_size = Math.round(file.getSize() / 1024);
    blob = file.getBlob();
    encoded = Utilities.base64Encode(blob.getBytes());
    sheet.insertRowAfter(1);
    sheet.getRange(2, 1, 1, 4).setValues([[file_name, file_size,  '', encoded]]);
    folder.removeFile(file);
  }
  return;
}

完成したと思って喜んだのですが、サイズの大きなファイルはエラーが発生。
原因はセルは50000文字しか入らないらしい。
それなら分割しようと思い実行すると今度はメモリ上限ですとエラーを吐かれました。
変数に入れれるサイズか、エンコードする文字数か。
正規表現で50000文字ごとに区切ろうとしたのでmacthの文字数制限か。
解決したら記事を編集します。

コード2

code.js
function encode_img(){
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
    const folderId = PropertiesService.getScriptProperties().getProperty('folderId');
    const folder = DriveApp.getFolderById(folderId);
    const files = folder.getFiles();
    var file;
    var file_name;
    var blob;
    var encoded;
    var data = [];
    var file_size;
    var i;
    var num;
  
    while(files.hasNext()) {
      file = files.next();
      file_name = file.getName();
      file_size = Math.round(file.getSize() / 1024);
      blob = file.getBlob();
      encoded = Utilities.base64Encode(blob.getBytes());
      // 50000文字毎に区切る
      num = Math.ceil(encoded.length / 4999);
      for(i = 0; i < num; i++){
        data.push(encoded.substr(i * 49999, 49999));
      }
      sheet.insertRowAfter(1);
      sheet.getRange(2, 1, 1, 3).setValues([[file_name, file_size,  '']]);
      sheet.getRange(2, 4, 1, data.length).setValues([data]);
      folder.removeFile(file);
  }
  return;
}

原因はmatchでした。
あと、一つのセルの上限は50000とエラーが出たけど49999っぽい。

【追記】
文字の頭文字によっては。「'」が先頭に挿入されます。
それが原因で文字数が+1されていました。
なのでセルの上限は50000文字です。

あとがき

今頃だけどローカルでエンコードしてGASで作ったWEBアプリにPOSTした方が便利かも。
9MBの画像をエンコードしてデコードしたら無事見れた。
スプレッドシート開こうとしたらめっちゃ重かった。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4