以前、以下を書きました。
ChatGPTのおかげで前から欲しかったプログラム(GAS)ができた - memorandums
うまくできたと思っていたのですが、実はうまく動作していないことがわかりました。ファイルのオーナーが学生のアカウント名にならないことがあった(というかその方が多かった)のと、あとは1課題につき1ファイルしか対応していませんでした。
その後、別件で以下を書きました。こちらはファイルの提出日時を取得するものでした。このときにファイルオーナーが異なることがわかったわけですが。
Google Classroomへの課題提出日時を取得したかったのです - memorandums
また、学生がファイル名を規則通りにつけてくれることは期待できないので、アカウント名+ファイル名で別途ファイル名をつけ直す必要もありました。
まとめると以下を対応したGASスクリプトを作りました、というのが本エントリーの主題になります。
- ファイルオーナーを学生アカウント名(メアド)で正しく取れるようにする
- 1課題に複数ファイルをアップロードした場合にも正しく重複を除外するようにする
- ファイル名をアカウント名+ファイル名でつけ直す
// フォルダID const folderId = "フォルダIDを入力してください"; function main() { const option = { // "orderBy": "title", "maxResults": 1000, } //ファイル情報を取得する let list = []; const files = Drive.Children.list(folderId, option); for (const file of files.items) { const f = Drive.Files.get(file.id); //console.log(f); list.push([f.lastModifyingUserName, f.originalFilename, Utilities.formatDate(new Date(f.createdDate), "JST", "MM/dd HH:mm:ss"), f.id]); } //複数回投稿している場合は最終更新時刻だけ残す list = list.sort(); //重複(ユーザ名とファイル名が同じ)している行を削除(日時の古⇒新に並んでいるので後ろを残す) list2 = [] let i = 0, j = 0; while (i < list.length) { j = i; while (j < list.length && list[i][0] == list[j][0] && list[i][1] == list[j][1]) j++; list2.push(list[j-1]); i = j; } // Create a new folder to store the latest versions of the files var latestFolder = DriveApp.createFolder("Latest Submissions"); for (let i = 0; i < list2.length; i++) { var file = DriveApp.getFileById(list2[i][3]); //file id file.makeCopy(list2[i][0] + "_" + list2[i][1], latestFolder); // file.makeCopy(file.getOwner().getEmail() + file.getName(), latestFolder); } }
このGASをご自身のGoogle Drive上に作成し(サービスからDriveを追加する必要があります)、コード中のfolderIdにClassroom中の課題フォルダのIDをいれて実行ボタンを押すと、Google DriveのマイドライブのトップにLatest Submissionsというディレクトリが作成されてそこに重複ファイルを除外したファイル群がコピーされます。
よければ使ってみてください。