Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

目的

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っぽい。

あとがき

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away