#Python から Google spreadsheet に画像を挿入
##やりたいこと(完成物)
時空間データ解析をしている中で,解析結果を可視化するにあたって以下のような地図画像等からなるリストを作りました.(図は一部コピーライトの関係で隠しています)
画像数が多く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);
}
これで画像つきリストが出来上がるはずなのですが,うまく画像が出力されない問題が発生しました.
画像が出力されないときの対処法
- 参照しているリンクをそのままブラウザ等で叩いてみる.画像が表示されればリンク貼り方に問題はない.
- 自分の場合はリンクについては問題ないが,画像が表示されなかった.色々調べた結果,spread sheet の画像には画像サイズに制限 があるらしい.
これをもとに,pngquantやsipsなどで画像サイズを小さくしたところ症状は改善した.
ただし,画像が多すぎたり一つ一つが大きい場合,半日程度待たないと表示されないことがあるので画像は極力小さくしましょう.
自分の場合,地図画像がfoliumからhtml作成→seleniumでスクリーンショットという手順で作ったもので,画像サイズが大き過ぎた模様です.画像取得の際にベクター画像で保存するなどの工夫も有効だと思われます. 挿入できるファイルはpng,jpg,gifのみのようです.(2/13修正)