ウ○娘のスクショからファン数取得→スプシに入力をGASで自動化
最近やってるソシャゲ、ウ○娘でサークル(=ギルド)というものがあり、各メンバーの貢献具合を可視化したい。ファン数の推移をスプシに記録するのが手っ取り早いが30人分のデータを手打ちするのは骨が折れる。
そこで今ちょいちょい勉強してるGASを用いて、Google Driveにスクショをアップロードするだけでスプシにファン数を自動入力してくれるようにしてみた
概要
今回行いたい処理は以下のような流れ
コードの手順
試作コード
Drive APIを有効にしておかないと動作しないので注意
function faninput() { function faninput() { var picFolderId = "スクショ画像を入れたフォルダのID"; var folder = DriveApp.getFoldersByName('スクショ画像を入れたフォルダ名').next(); var images = folder.getFilesByType('image/png'); var sheet = SpreadsheetApp.getActiveSheet(); var titleAndText = []; while(images.hasNext()){ var image = images.next(); var docName = image.getName().split("\.")[0]; var createDateRaw = image.getDateCreated(); var createDate = Utilities.formatDate(createDateRaw,"JST","YYYY/MM/dd HH:mm"); var Request_body = { title: docName, mimeType: 'image/jpeg' } Drive.Files.insert(Request_body, image, { ocr: true }); var newFile = DriveApp.getFilesByName(docName).next(); folder.addFile(newFile); DriveApp.getRootFolder().removeFile(newFile); var docs = folder.getFilesByType('application/vnd.google-apps.document'); var file = docs.next(); var docId = file.getId(); var doc = DocumentApp.openById(docId); var text1 = doc.getBody().getText().split('数 ')[1]; var text2 = doc.getBody().getText().split('数 ')[2]; var text3 = doc.getBody().getText().split('数 ')[3]; var numtext1 = text1.split("人")[0]; var numtext2 = text2.split("人")[0]; var numtext3 = text3.split("人")[0]; titleAndText.push([createDate, docName, numtext1, numtext2, numtext3]); DriveApp.getFolderById(picFolderId).removeFile(file); DriveApp.getFilesByType('application/vnd.google-apps.document').next().setTrashed(true); } sheet.getRange(2, 1, titleAndText.length, titleAndText[0].length).setValues(titleAndText); var range = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()); range.sort({column:1, descending: false}); }
コードの解説
前提としてGoogleドライブのフォルダに以下のようなスクショ画像を保存しておく
赤丸で囲った3人のファン数 "156,278,997" "155,749,508" "152,118,656"という3つの文字列を取得し、スプレッドシートに入力している
ゲーム内で役職順にソートすれば月を通してメンバーの掲載順を固定化してスクショ撮れる
上から順に3人分が載ったスクショをそれぞれ別のフォルダに保存しておく(フォルダ1にはAさんBさんCさんが写ったスクショ、フォルダ2にはDさんEさんFさんが写ったスクショといった感じ)
あとは上記スクリプトをコピペして10個用意し、取得する対象フォルダのIDと44、46行目のgetRange()で取得するセル範囲を変更してあげれば同じシートに30人分出力できる
部分ごとに処理を解説していく
①指定フォルダからスクショ画像ファイルからファイル名を取り出す
var picFolderId = "スクショ画像を入れたフォルダのID";
var folder = DriveApp.getFoldersByName('スクショ画像を入れたフォルダ名').next();
var images = folder.getFilesByType('image/png');
②取り出した画像とファイル名と一緒にOCRオプションを利用してOCR用のドキュメントファイルを作成する
var Request_body = {
title: docName,
mimeType: 'image/jpeg'
}
Drive.Files.insert(Request_body, image, { ocr: true });
var newFile = DriveApp.getFilesByName(docName).next();
folder.addFile(newFile);
DriveApp.getRootFolder().removeFile(newFile);
③テキストを取り出し、splitメソッドで分割することでファン数の数値部分だけ取り出してスプシに移行するため配列に入れておく
var docs = folder.getFilesByType('application/vnd.google-apps.document');
var file = docs.next();
var docId = file.getId();
var doc = DocumentApp.openById(docId);
var text1 = doc.getBody().getText().split('数 ')[1];
var text2 = doc.getBody().getText().split('数 ')[2];
var text3 = doc.getBody().getText().split('数 ')[3];
var numtext1 = text1.split("人")[0];
var numtext2 = text2.split("人")[0];
var numtext3 = text3.split("人")[0];
titleAndText.push([createDate, docName, numtext1, numtext2, numtext3]);
実際にLogger.log()でnumtext1、numtext2、numtext3を出力するとこのようになる
④スプレッドシートにスクショをドライブにアップした日、ファイル名、ファン数を入力する
sheet.getRange(2, 1, titleAndText.length, titleAndText[0].length).setValues(titleAndText);
var range = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn());
range.sort({column:1, descending: false});
1行目はヘッダに用いるのでgetRange()の範囲指定を2行A列目を開始セルにしている
実際に運用してみて
コード書ききった後にGASのドキュメント作成制限250/日に引っかかるかもしれないことに気がついたがもうめんどくさいのでアカウント2つ用意して画像フォルダとスプシを共有アイテムにすることで解決した。