Googleドライブ内のKeePassDB_Backupファイルを自動でフォルダ移動させる

verdigris.hatenadiary.jp
これの続き。

KeePass+KeeAnywhereでGoogleドライブとの同期を続けるため設定を変更した結果、データベースファイルがGoogleドライブのルートフォルダに保存されるようになり、イコールKeeAnywhereが自動作成するバックアップファイルもルートフォルダに保存されることとなりました。
このままでは"KeePassDB_Backup_YYYY-MM-DD-HH-MM-SS"なるファイルが無限にルートフォルダに増えていきます。普段遣いしないファイルがルートフォルダに溜まっていきます。
整理が必要ですが、自動で作成されるファイルを手動で削除だのファイル移動だのやってられません。
バックアップしないという悪魔のささやきは置いといて、自動で作成されるバックアップファイルを自動でフォルダ移動させる方法を模索。

Googleドライブ内のファイル操作ならGoogleAppsScriptが適任ですが、中の人に一からプログラムを書く能力がないので、ぐぐって見つけたサイト様のスクリプトを改変させていただくことに。
色々試した結果、
at-tec.com
こちらの「”フォルダ名”含むファイルをそのフォルダに移動させるスクリプト」をベースに
「ルート(親)フォルダに保存されている"KeePassDB_Backup"を含むファイル名のファイルを"KeePassDB_Backup"(子)フォルダへ移動するスクリプト」を作成し運用することにしました。
ファイル名とフォルダ名を部分一致させる必要があるので、自動作成されるファイル名である"KeePassDB_Backup_YYYY-MM-DD-HH-MM-SS"に準じて固定部分の"KeePassDB_Backup"を移動先の子フォルダ名とします。
スクリプトでは親フォルダ取得のため先にフォルダid指定が必要でしたが、対象がルートフォルダならば1行で親フォルダ取得ができます。改変したのはそこくらい。

function personalFolder() {
//親フォルダ取得
const folder = DriveApp.getRootFolder();

//親フォルダ内の子フォルダ名取得
const childFolder=folder.getFolders();
while(childFolder.hasNext()){
const namedFolder=childFolder.next();
const name=namedFolder.getName();

//親フォルダ内に子フォルダ名含むファイルあるか探してあったら移動
const parentFolder = DriveApp.getRootFolder();
const files=parentFolder.getFiles();
while(files.hasNext()){
const file=files.next();
if(file.getName().match(name)){
const moveFile=file.moveTo(namedFolder);
}else{}
}
}
}

 
デバッグや実行してルートフォルダにあるバックアップファイルがフォルダ移動できていれば、このスクリプトが自動で実行されるようトリガーを設定しておきます。
バックアップファイルの作成は月一程度とはいえGoogleドライブ自体はわりと頻繁に使うので、ファイルが目ざわりにならぬよう実行頻度は毎日夜中に。
詳しい設定方法は
www2.kobe-u.ac.jp
わかりやすいサイト様へ。
 
このスクリプトスプレッドシートをどのフォルダに保存しても動くので、ルートフォルダでもKeePassDB_Backupフォルダでもわかりやすい場所にわかりやすい名前をつけて保存しておきます。
 
若干の問題点は、KeeAnywhereはルートフォルダしか参照しないので、パソコンからバックアップファイルを使って復旧するにはKeePassDB_Backupフォルダへ移動させたファイルをルートフォルダへ戻さなければなりません。しかしバックアップファイルが必要になる事態はそうそうなく、そもそもパソコンが目の前にあるならその場でGoogleドライブ開けてファイル操作すれば解決します。
あとはバックアップファイルのタイムスタンプがフォルダ移動した日時に上書きされてしまいますが、正確なタイムスタンプはファイル名にあるので目くじら立てるほどではないかなと。

というわけでKeeAnywhereがGoogleドライブの子フォルダも参照できるようになるまでの暫定対策でした。

【参考】

フォルダ整理プログラムを作りたい!*”フォルダ名”含むファイルをそのフォルダに移動させるスクリプト/GAS | アットテック株式会社
https://at-tec.com/gas02/
【簡単!】GASでフォルダーを指定する方法 - Yuki's bnb blog
https://www.yukibnb.com/entry/2019/11/26/163738
Google Apps Script 入門
https://www2.kobe-u.ac.jp/~tnishida/programming/GAS-01.html

KeePass+KeeAnywhereがGoogleドライブとの同期に失敗するので

ちょっと前から気になっていた件にようやく着手。若干手こずったので備忘録。
 
簡単に言うとパソコンからKeePassでGoogleドライブに共有しているkdbxファイルにアクセスしようとすると、権限不足エラーが出て同期できない。代わりにローカルバックアップが表示される。
AndroidiOSのKeePass系アプリからは接続できるので、問題が生じているのは同期に使用しているプラグインであるKeeAnywhere。
そのうち更新入るやろとローカルバックアップのまま使い続けていたけれど、プラグイン側に動きがなさそうなので対処開始。他のプラグインを使うという手は無し。
なおKeePass2.57(日本語化済)+KeeAnywhere2.1時点での出来事。エラーメッセージや参考サイトはこのページ最下部に。
 
 
従来KeeAnywhere SettingsのAccountsに登録していたGoogleDriveは、Checkしてもブラウザでのログインへ遷移後[このアプリはブロックされます]のみ表示され取り付く島がないので、KeePassメニューの

ツール>KeeAnywhere Settings>Accounts>Add>GoogleDrive(restricted)

から制限付きGoogleDriveを新規登録。ブラウザログインへ遷移後、Googleドライブ上ファイルの参照、編集、作成、削除権限付与を許可する。これはKeePass+KeeAnywhereを使用しているパソコンすべてで行う。

これでGoogleドライブに接続はできるも、
・KeePassメニューの ファイル>開く>Open from Cloud Drive> ではマイドライブのルートフォルダしか参照できない
・ルートフォルダにあっても既に保存されているkdbxファイルは認識しない
ので元のkdbxファイルは参照できず、要追加作業。
なおKeePassメニューの ファイル>URLから開く を実行するにはデータファイルへのフルパスが必要なので、フルパスが取れないGoogleドライブ上のファイルでは無理。
 
 
追加の作業はKeePassからGoogleドライブへのファイル保存。
Googleドライブに保存されているkdbxファイルをローカルにダウンロードする。ファイル>開く>ファイルから開く でダウンロードしたデータが表示されたら

ファイル名をつけて保存>Save to Cloud Drive からGoogleDrive(restricted)のAccountにファイル名を入力して保存

Googleドライブ上の元のkdbxファイルがルートフォルダにあって名前の衝突が起きるなら元ファイルを一旦削除かフォルダ移動。上書きでいけるかは未確認。

KeePassのローカルバックアップデータの最終更新日がGoogleドライブ上のkdbxファイルより後なら

ファイル名をつけて保存>Save Copy to Cloud Drive からGoogleDrive(restricted)のAccountにファイル名を入力して保存

Googleドライブ上の元のkdbxファイルがルートフォルダにあって名前の衝突が起きるなら元ファイルを一旦削除かフォルダ移動。上書きでいけるかは未確認。

とにかく最初回はKeePassから保存する必要がある。一度登録すれば別パソコンでも Open from Cloud Drive から参照可能。
 
 
これらの結果、参照するkdbxファイルが変更されるため、AndroidiOSアプリでも参照先を再登録。これでようやく従来の使用感へ。
ただkdbxファイルをGoogleドライブのルートフォルダに保存するということは、バックアップファイルも……ルートフォルダに。だから別フォルダにkdbx保存してたんですけど?!
 
【追記】なんとかしてみた
verdigris.hatenadiary.jp

 
 
なお最終手段はGoogleドライブ捨ててOneDriveに切り替える。そちらはややこしい手順なく、ポチポチしていけば設定も同期も可能。別フォルダの参照も可能。
KeeAnywhereにプリセットされている他クラウドサービスでも他デバイスで使用しているアプリが対応していれば。ただKeeAnywhere・Keepass2Android Password・KeePassium併用ではOneDriveかDropboxくらいしかないような。
 
 
権限不足エラーと格闘中にGoogleアカウントの設定確認したら、
 Googleアカウント>セキュリティ>サードパーティ製のアプリとサービスへの接続

 Googleアカウント>データとプライバシー>サードパーティ製のアプリとサービス
でKeeAnywhereに付与されているアクセス権が[プロフィール情報の参照]のみに。
AndroidiOSアプリでは[このアプリで使用する Google ドライブ上の特定のファイルのみの参照、編集、作成、削除]も付与。
いつの間にかKeeAnywhereから権限が取り上げられて"不足"になったらしい。
 
ついでにうちの権限不足エラーメッセージ転記

Error loading file list.
Exception:

Google.Apis.Requests.RequestError
Request had insufficient authentication scopes. [403]
Errors [
     Message[Insufficient Permission] Location[ - ]
Reason[insufficientPermissions] Domain[global]
]



【参考】
github.com
https://github-com.translate.goog/Kyrodan/KeeAnywhere/issues/432?_x_tr_sl=auto&_x_tr_tl=ja&_x_tr_hl=ja
※上記ブログカード[Google.Apis: Error 403: Request had insufficient authentication scopes]の日本語翻訳(Google)リンク

https://www.reddit.com/r/KeePass/comments/1gsphbl/comment/lxkjwr4/

烈火ガチャ


忍者で絞られてオーブねえよバカー!!!!!
あとなんでマーカスまだハブられてんの。

S766(約12歳)


次はAシリーズかSシリーズか悩んでいたけれど、Sにしよう。物理キーは多少壊れても動く。
よく考えたら現行のAシリーズはAndroid搭載なので、それならスマホでええやんとも思った次第。ストリーミングサービス使わないのにOSに余計な容量と電池食われても。スマホの寿命を伸ばしたいから専用機を使うのに、そっちもスマホみたいなもんというのは少し頭が追いつかない。何より今のスマホXperiaなだけにwww
あとAndroid自体の寿命が読めないのが。5年は戦ってもらわないと困る。

(製造年の下一桁 季節 - X X)

1万円ちょいで購入し愛用していたユニクロの冬コートにクリーニング屋に受付を渋られるレベルの穴が空き、ユニクロからしゃーない、今度は少し高くても頑丈なメーカーで長く着られるほうが良いかと奮発。
ちょうどユニクロ製品の製造年の確認方法が話題になっていたので、穴開きコートは何年着ていたのか確認しようと裏地出したら、
 

意外と粘っていたけれど、ユニクロじゃない初冬コートは20年以上現役なんすよ。