最近サムネイルを取得するコードをGASで書く機会があったのですが、何度もエラーに悩まされたので、解決方法(正直なんでうまく行っているのか明確にはわかっていないが)を備忘録的に残しておこうと思います。
同じエラーに悩んでいる人の解決につながれば幸いです。
やりたかったこと
①スプレッドシート上に記載のあるダウンロード可能な動画へのURLを取得
②ダウンロードした動画を、動画用のGoogle Driveに保存して、そのままその動画のサムネを取得
③取得したサムネ画像をサムネ画像用のフォルダに保存
実際に記載したコードはこちら。
function getVideos() {
var sheetName = "シート名";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetName).getDataRange().getValues();
var lastRow = ss.getLastRow();
var video_url_cell = "動画のURLが記載されている列番号";
var video_name_cell = "設定したい動画名が記載されている列番号"
for(let i = 1; i < lastRow ; i++){
var video_url = sheet[i][video_url_cell];
var video_name = sheet[i][video_name_cell];
downloadVideo(video_url,video_name);
}
getThumbnail();
}
function downloadVideo(url, name){
var responce = UrlFetchApp.fetch(url);
var fileBlob = responce.getBlob().setName(name);
// 動画を保存したいフォルダのID
var folderID = "###################";
var folder = DriveApp.getFolderById(folderID);
var file = folder.createFile(file);
}
function getThumbnail(){
//動画が格納されているフォルダを取得
var videoFolderID = "###################";
var videoFolder = DriveApp.getFolderById(videoFolderID);
//サムネイルを格納するフォルダ取得
var thumFolderID = "###################";
var thumFolder = DriveApp.getFolderById(thumFolderID);
var files = videoFolder.getFiles();
while(files.hasNext()){
var file = files.next();
var imageId = file.getId();
let newFile = DriveApp.getFileById(imageId);
var thumbnail = newFile.getThumbnail();
var fileName = newFile.getName();
thumFolder.createFile(thumbnail).setName(fileName);
}
}
Exception: Argument cannot be null: blob
こんな感じで何度やっても上記のエラーが出てきました。
「URLから動画を保存→サムネ取得を一回の実行でやるとエラー」が起きるのですが、
getVideos()とgetThumbnail()を別々で実行するとうまくいきました。
解決策
動画の保存とサムネの取得のコードを分けて、それぞれ別で実行する。
まとめ
めちゃくちゃ妄想ベースで考えると、DriveAppのcreateFileって、一度処理をクローズしないとC言語のfclose的な操作がされないのでは? とか思っていました。
そのため、プログラム実行上はまだ確定したファイルになっていなくて、nullと表示されてしまうとか…
ちょっとDriveAppの仕様までたどる元気がなかったので、いったんこの疑問はタンスにしまっておきます。
なにか知っている方は教えていただけますと幸いです(白目)