1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GASでspreadsheetに画像つきリストを作る

Last updated at Posted at 2020-02-02

#Python から Google spreadsheet に画像を挿入

##やりたいこと(完成物)
時空間データ解析をしている中で,解析結果を可視化するにあたって以下のような地図画像等からなるリストを作りました.(図は一部コピーライトの関係で隠しています)
sample_.png
画像数が多く1つずつポチポチするのは嫌なのでスクリプトで画像の挿入を行ないました.
やりかたと詰まったところをまとめておきます.
##基本的な画像の挿入方法
google spreadsheet では,方法は以下の2通りの方法で画像を挿入できる.
1.IMAGE関数で画像のリンクを参照.
2.「挿入」→「画像」→「セル内の画像」から直接画像を埋め込む.
このあたりについては,下のサイトなどを参照してください.
https://officeforest.org/wp/2019/04/16/google-apps-script
https://tom2rd.sakura.ne.jp/wp/2019/05/16/post-9098/

 GASで自動化するにあたり,2020/2/1現在,2の方法では「セル中に挿入」することができず不便なので,今回は1の方法を使っています.
1の方法はセル内の関数で別途google drive上にアップロードした画像をリンクから参照する方法で,うまく画像が出力されないことがあるので,GASからのセル内挿入が可能になったらそちらの方が良いかもしれません.Googleさんに期待です.
 まず準備として,google drive上のフォルダに{n}.png (n=1~500)とした画像をアップロードしておきます.これらをIMAGE関数で参照するという流れです.IMAGE関数を挿入するために書いたスクリプトを載せておきます.


function insert_fig() {
  var folder_id = 'hogehoge';  //folder id
  folder = DriveApp.getFolderById(folder_id);
  files = folder.getFiles();
  list = []; //この変数のファイル名・URLが入っていきます
  rowIndex = 2; // The starting row of a range.
  colIndex = 4; // The starting row of a column.
  var ss;
  var sheet;
  var range;
  sheetName = 'sheet_name'; //デフォルトのシート名がシート1です。
  
  while(files.hasNext()) {
    var buff = files.next();
    list.push([buff.getName(), buff.getUrl()]);
  };

  //今回,ランキングのリストを作っているので,ファイル名でソート
  list_sorted = list.sort(function(a,b){return(a[0].replace(/[^0-9]/g, '') - b[0].replace(/[^0-9]/g, ''));});

  //IMAGE関数で指定するリンクの形に整形
  var file_urls = list_sorted.map(function(value) {
    var pattern = /[\/]/;
    return ['=IMAGE("http://drive.google.com/uc?export=view&id='+ value[1].split(pattern)[7]+'")'];
  });

  ss = SpreadsheetApp.getActive();
  sheet = ss.getSheetByName(sheetName);
  range = sheet.getRange(rowIndex, colIndex, file_urls.length, file_urls[0].length);
  
  // 対象の範囲にまとめて書き出し
  range.setValues(file_urls);
}

これで画像つきリストが出来上がるはずなのですが,うまく画像が出力されない問題が発生しました.

画像が出力されないときの対処法

  1. 参照しているリンクをそのままブラウザ等で叩いてみる.画像が表示されればリンク貼り方に問題はない.
  2. 自分の場合はリンクについては問題ないが,画像が表示されなかった.色々調べた結果,spread sheet の画像には画像サイズに制限 があるらしい.
    これをもとに,pngquantやsipsなどで画像サイズを小さくしたところ症状は改善した.

ただし,画像が多すぎたり一つ一つが大きい場合,半日程度待たないと表示されないことがあるので画像は極力小さくしましょう.
自分の場合,地図画像がfoliumからhtml作成→seleniumでスクリーンショットという手順で作ったもので,画像サイズが大き過ぎた模様です.画像取得の際にベクター画像で保存するなどの工夫も有効だと思われます. 挿入できるファイルはpng,jpg,gifのみのようです.(2/13修正)

1
5
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
1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?