GASでGoogle Driveのファイルにアクセスするときには少し癖がある。例えば、"ABC/DEF"フォルダにアクセスするために"DocsList.getFolder(path)"という関数が提供されており、"/"をセパレータとしてフォルダやファイルを指定することができる。
var folder = DocsList.getFolder('ABC/DEF/GHI');
しかし、
GASのReferenceによるとこの関数は"Deprecated. This function is deprecated and should not be used in new scripts."となっている。Deprecatedになった理由を考えてみるとGoogle Driveの癖のある仕様に行き着く。 Windows(DOS)やLinixなどではPATHでファイル/フォルダを識別しているが、Google Driveでは同じフォルダに同じ名前のファイルやフォルダを作成することができるため、PATHを指定しても一つのファイル/フォルダを特定できないのだ。 そのため以下の様な構成も可能なのであり、'ABC/DEF/GHI'と指定しても(1)〜(4)のどのフォルダなのか特定することができない。
ABC/
DEF/
GHI/ ・・・(1)
GHI/ ・・・(2)
DEF/
GHI/ ・・・(3)
GHI/ ・・・(4)
Google Driveで一つのファイルやフォルダを特定するのはIDであり、パスではないので注意が必要だ。例えば、スクリプトのログをひとつのファイルに保存し続けたい場合などは注意が必要だ。確実に同じファイルにアクセスするためには一度作成したファイルのIDを保存しておきそのIDを用いてアクセスしなければならない。
今後作成するスクリプトでログを残したくなることがあると思うので、まずはScript/Logフォルダにログファイルを保存する仕組みを考えていきたい。
目標仕様としては
- ログファイルIDをスクリプトのプロパティとして保存する。
- 初回起動時などプロパティにログファイルIDが保存されていない時は指定されたパスに従いファイルを探す。
- 指定されたパスのファイルが存在しなかった場合には新規ファイルを作成し、IDをプロパティに保存する。
- 指定されたパスのファイルが存在しているときは最初に見つかったものを採用し、IDをプロパティに保存する。
注意事項としては以下の構成で"Script/Log/yyyLog.TXT"を見つけることだ。
(1)のScriptフォルダに入り、(2)のLogフォルダに入り、"yyyLog.TXT"を検索し見つからなかった場合、(2)のフォルダに"yyyLog.TXT"を作っていはいけない。(1)フォルダ下の検索が完了したら(3)フォルダ、(4)フォルダと検索しyyyLog.TXTを見つけなければならない。
Script/ ・・・(1)
Log/ ・・・(2)
Script/ ・・・(3)
Log/ ・・・(4)
yyyLog.TXT
仕様として考えなければいけないこととしては"yyyLog.txt"が存在しない時にどこにファイルを作成するかだ。
案1:最初に見つかったフォルダに作成
Script/ ・・・(1)
Log/ ・・・(2)
yyyLog.TXT
Script/ ・・・(3)
Log/ ・・・(4)
案2:最後に見つかったフォルダに作成
Script/ ・・・(1)
Log/ ・・・(2)
Script/ ・・・(3)
Log/ ・・・(4)
yyyLog.TXT
実際には同じフォルダに同じ名前のファイル/フォルダを作成することはないのだが、しっかり考えて見ると面倒なことに気がついた、、、