私が所属しているグループでは、Googleドライブ上に、Googleスプレッドシートなどの多くの成果物を蓄積しています。
これらを活用する際、必要な情報を迅速に見つけ出すのが困難で、効率的なアクセス方法が求められていました。そこで、それらを一覧として整理しました。
具体的には、ファイル名とURLを表形式にしたリンク集を作成しました。ファイル名とそのURLは、GAS(GoogleAppScript)を用いて抽出しました。このページでは、作成したスクリプトについて説明します。
このスクリプトは指定したフォルダにあるファイルのURLを取得するものですが、別のフォルダにあるファイルのURLも取得したい場合には、そのフォルダIDを設定することでそのファイルたちのURLを取得することができます。
リンク集の作り方
URLを取得したいファイルがあるフォルダの「フォルダID」をメモしておく
GASでファイル名とURLを取得するためには、そのファイルが所属するフォルダの「フォルダID」が必要になります。
Googleドライブで、ファイル名とURLを取得したいフォルダを表示すると、図1のように、そのフォルダのURLが存在することが分かります。フォルダIDは、表示したGoogleドライブのURLの下記ハッチング部になります。このフォルダIDを一旦メモしておきます。
マイドライブにGoogleスプレッドシートを新規作成する
リンク集用のスプレッドシートを新規作成します。図2のように、「新規」→「Googleスプレッドシート」→「空白のスプレッドシート」を選択します。
拡張機能 > Apps Scriptを選択
新規作成したGoogleスプレッドシートに、GASを組み込みます。図3のように、新規で作成したGoogleスプレッドシートの「拡張機能」→「Apps Script」を選択します。
Apps Scriptのエディタに下記スクリプトを入力
Apps Scriptを選択すると、図4のようにGASのエディタが表示されます。
一旦、「function myFunction() 、、、」を全部消し、下記の「記載するGASコード」を、図5のようにコピペし、「★★★ フォルダーIDを記入 ★★★」には、一番初めにメモしたフォルダIDを入力してください。
記載するGASコード
※「★★★ フォルダーIDを記入 ★★★」には、一番初めにメモしたフォルダIDを入力してください。
function createSharedUrl() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
//変数folderに、フォルダオブジェクトを代入
//★★★ フォルダーIDはを記入 ★★★
var folder = DriveApp.getFolderById("★★★ フォルダーIDを記入 ★★★");
//フォルダー内の全ファイルを変数folderFilesに格納する
//変数folderFiles格納されるデータはイテレーターという形式
//※フォルダー直下のファイルのみ格納する
var folderFiles = folder.getFiles();
//ファイル名を格納するための空の配列を宣言する
var allFiles = [];
//変数folderFilesに格納されている全ファイルのファイル名と
//共有リンクを配列allFilesに二次元配列で格納する
while(folderFiles.hasNext()) {
//配列allFilesに追加する配列(ファイル名と共有リンク)を
//ループ中に一時的に格納するための空の配列tempFileを宣言する
var tempFile = [];
//変数folderFilesからファイルのイテレーターをひとつ取り出し
//変数fileIteratorに格納する
var fileIterator = folderFiles.next();
//ファイル名を取得する
var fileName = fileIterator.getName();
//ファイルIDを取得し、ファイルIDをもとにファイルを
//指定し変数fileに格納する
var fileId = fileIterator.getId();
var file = DriveApp.getFileById(fileId);
//変数fileの共有設定を「リンクを知っている全員が閲覧化」に変更する
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
//共有リンクを変数shareUrlに格納する
var shareUrl = file.getUrl();
//配列tempFileにファイル名と共有リンクを格納する
//この時点で配列tempFileは以下のようになっている
//tempFile = [ファイル名, 共有リンク]
tempFile.push(fileName);
tempFile.push(shareUrl);
//配列tempFileを配列allFilesに格納する
//配列の中に配列を入れるのでallFilesは
//以下のような二次元配列になる
//allFiles = [[ファイル名1, 共有リンク1],[ファイル名2,共有リンク2],….]
allFiles.push(tempFile);
}
//配列allFiles内の要素数、つまり必要な行数を確認する
var numRow = allFiles.length;
//配列allFiles内の一つ目レコードの要素数、つまり必要な列数を確認する
//今回はレコードの要素は「ファイル名」と「共有リンク」なので2になる
var numCol = allFiles[0].length;
//アクティブなシートの2行目にペースト
sh.getRange(2,1, numRow, numCol).setValues(allFiles);
}
createSharedUrlを実行
「実行」を選択してください。関数「createSharedUrl」が実行されます。
自身のアカウントによるデータアクセスの承認など
記述したスクリプトは、クラス「SpreadsheetApp」を使用し、GASでスプレッドシートを操作しようとしています。そのためGoogleはユーザーにデータの操作などによるリスクを再確認させるために、下図のような「アクセス権限を承認」画面が出してきます。「権限を確認」をクリックして下さい。
この後も、Googleドライブのデータ操作の承認ダイアログが続きます。
次のダイアログでは、使用中のアカウントを選択してください。
次に、警告アイコン付きのダイアログが出てきますが心配しなくて大丈夫です。
まず、左図の左下「詳細」をクリックします。すると右図のように、画面下にメッセージが増えますのでその中の「【スプレッドシート名称】(安全ではないページ)に移動」をクリックして下さい。
最後に左図のダイアログが表示されますので、「許可」をクリックしてください。
すると処理が進み、右図のように実行ログが表示され、スプレッドシートにファイル名称とURLのリストが出力されます。
このような感じです。
コード内で使っているGAS関数の解説
コード内の処理を、クラスごとに説明します。(コード順の説明ではないです)
- SpreadsheetApp.getActiveSpreadsheet():アクティブなスプレッドシート(スプレッドシートであって、スプレッドシート内の各シートではない)に対するオブジェクトを取得する。
- getActiveSheet():スプレッドシートオブジェクトのシートオブジェクトを取得する。
- getRange(2,1, numRow, numCol).setValues(allFiles):2行1列目から指定の行番号列番号の範囲に、指定した配列の値を出力する。
- getActiveSheet():スプレッドシートオブジェクトのシートオブジェクトを取得する。
- DriveApp.getFolderById():引数に指定したフォルダIDから、フォルダオブジェクトを取得する。
- getFiles():フォルダ内のファイルオブジェクト(FileIteratorオブジェクト)を取得するメソッド。FileIteratorオブジェクトは下記メソッドを持ち、ファイルの取得ができる。
- hasNext():まだ処理していない次のファイルが存在するかどうかを確認します。存在すれば
true
を返し、存在しなければfalse
を返します。 - next():処理されていないファイルを取り出します。
- getName():next()で取得したFileIteratorから、ファイル名を取得する。
- getId():next()で取得したFileIteratorから、ファイルIDを取得する。
- hasNext():まだ処理していない次のファイルが存在するかどうかを確認します。存在すれば
- getFiles():フォルダ内のファイルオブジェクト(FileIteratorオブジェクト)を取得するメソッド。FileIteratorオブジェクトは下記メソッドを持ち、ファイルの取得ができる。
- DriveApp.getFileById():引数に指定したファイルIDからファイルオブジェクトを取得する。
- setSharing():ファイルオブジェクトに対して共有設定を変更する。
- getUrl():ファイルオブジェクトの共有URLを取得する。
コメント