GASで発行したファイルのリンクを取得する
Google Apps Script(GAS)を使って作成したファイルのリンクを取得する方法をご紹介します。今回は取得してそのままスプレッドシートで管理できるように一覧化するとこまでをGASで記述します。
GASで実行したファイルのリンクを取得する方法
実行したファイルのリンクをそのまま取得するのは意外と難しい
GASで作成したスプレッドシートやPDFファイルを管理できるようにリンクと一緒に管理したいと思った時、処理方法を考えるのは意外と難しい気がします。
GASの実行によってファイルが作成する場合、まず、取得したいURLリンクは保存した時点(GASのスクリプトが完了した時点)で作成されるため作成前に取得はできません。また、作成後にファイル情報を取得しようとすると、例えば保存先のフォルダに複数のファイルがある場合は同名のファイルの存在も念頭に置かねばならず、GASでファイル取得した時の取得順序も必ずしも日付順であるわけではないので、どのように作成したばかりのファイルを抽出するかテクニックが必要になります。
ファイルリンクを取得するステップ
少し回り道はしますが、下記のステップで作成したファイルの情報をそのまま読み込むことが可能です。
- GASの実行による特定のフォルダにファイルを保存
- 直後にフォルダ内のすべてのファイル情報を取得して、ファイル単位の情報を要素とした二次元配列を作成
- 作成日時をキーとして、日付が最も新しくなるように二次元配列の要素を並び替え
- 作成日が最も新しいファイルの情報を処理
サンプルコード
下記の記事で解説している請求書を作成後、作成したファイルの情報をリンクとともに一元管理できるように情報整理してスプレッドシートに入力するスクリプトを考えます。
function main() {
//記述省略
//フォームの入力情報を取得し、請求書作成するスクリプト
// PDF化した請求書を保存するフォルダ
const folderId = '保存用のフォルダID';
// 入力更新済みの請求書をPDF化してGoogleドライブのフォルダに保存
createInvoice(spIdInvoice, info, num, folderId);
// スプレッドシート「発行済み請求書一覧」のファイルID
const spIdList = '一覧管理用のスプレッドシートのファイルID';
// 発行済みの請求書のURLと発行日を一覧化
inputList(spIdList, info, folderId);
}
// 日付降順に並び替えるための関数
function sortCreated(a, b){
if (a[1] < b[1]) {
return 1;
} else if(a[1] > b[1]){
return -1;
}else{
return 0;
}
};
function inputList(id, info, folderId){
let sheet = SpreadsheetApp.openById(id).getActiveSheet();
let inputRow = sheet.getLastRow() + 1; // 「入力済みの行 + 1」行目に入力
const folder = DriveApp.getFolderById(folderId); //ファイルが保存されているフォルダID
const files = folder.getFiles(); //すべてのファイルを取得
let fileInfo = [];
while(files.hasNext()){
let file = files.next();
fileInfo.push([file.getDateCreated(),file.getUrl()]); // ファイル作成日、ファイルURLを取得
}
//並び替え実行、作成された日時が最も最新のファイルが第一要素に
fileInfo.sort(sortCreated);
sheet.getRange(inputRow,1,1,4).setValues([[fileInfo[0][0],fileInfo[0][1], info[1], info[3]]]);
}
一覧化用のスプレッドシートを用意しておきます。請求書の作成日、リンク、取引先名、担当者名を入力できるようにしておきます。

二次元配列の並び替え
ファイルID単位の情報配列を一つの要素とした二次元配列を作り、その各要素の日付で並び替えを行います。並べ替え用の関数を定義したうえでsortメソッドを実行することで、二次元配列の特定要素で並び替えができます。
下記は各配列の第2要素をキーとして降順に並び替えるための関数です。
// 日付降順に並び替えるための関数
function sortCreated(a, b){
if (a[1] < b[1]) {
return 1;
} else if(a[1] > b[1]){
return -1;
}else{
return 0;
}
};
この並び替え用の関数を引数としてsortメソッドを実行すれば、第2要素に指定した日付が新しい順で並び替えが実行されます。ちなみにsortメソッドは変更メソッドで、実行したらもとに変数が並び替えられるので、新たに変数を定義・格納する必要はありません。
//順序確認、作成された日時が最も最新のファイルが第一要素に
fileInfo.sort(sortCreated);
sheet.getRange(inputRow,1,1,4).setValues([[fileInfo[0][0],fileInfo[0][1], info[1], info[3]]]);
無事、作成したファイルの情報を取得して一覧化することができました。
