LoginSignup
1
2

More than 1 year has passed since last update.

GASのgetThumbnail()がうまく行かなくて苦労した

Posted at

最近サムネイルを取得するコードを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の仕様までたどる元気がなかったので、いったんこの疑問はタンスにしまっておきます。
なにか知っている方は教えていただけますと幸いです(白目)

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