おきらくミルフィーユさん

まったりしてもいられないが、なるようになれ。限りなく言語障害に近い私が私なりにコトバで伝えることができたらよいな。と思って始めました。

DriveAppの権限がなくてしょげてる人

【こんな人向け】
・DriveAppを使いたいが、権限のエラーが取れない
・DriveAppの代用品を探している

 

※上記の人向けなので、この記事は初心者向けではございません。

 

Googleドライブは別な場所へのフォルダコピーが手動ではできない。
なので、カレントにコピーを作ってから移動するという手段になる。

※【追記】ファイルはコピーも切り取りもついにできるようになりました!!

 

GAS(GoogleAppsScript)にDriveAppというクラスがあって、それを使用すれば
ある程度のめんどくささは解消できる。

※GASのDriveAppについてはこちらを参照ください

developers.google.com

 

フォルダの作成やフォルダ内の情報作成なんかもDriveAppを使えばできる。

 

よーしと思ってGASを組んでみていざ実行という時
syntaxは問題ないのに権限のエラーが取れない。

権限のつけ方を探したいがいくら検索しても見つからない。

 

ぐらいの方々がこちらを見ているのではないかと思います。

 

残念。

 

権限を自分でつける方法はないようです。

 

管理者につけてもらう必要がありますが

DriveAppを絞るにはそれなりの理由があるはずですから
こちら側もそれなりの理由がないと付与されないと思います。

ゆえに、基本的にはあきらめてください。

 

じゃあどうするんだよ。ていう事なんですが。

 

フォルダのコピー例として、

例えば何かのプロジェクトのひな型フォルダを
ドライブに管理しててコピーして使うんだ、という場合は

 

ひな型フォルダをドライブで管理せず

ローカルに置いて使う時にドライブにコピーしていく。

 

これしかないんですね。

 

ひな型フォルダをドライブで管理してしまうと

移動してまた作る、またはコピーして移動してリネーム
という効率の悪い謎の作業を繰り返す事になりますから無駄です。

 

また、この時


「ほんとはスプレッドシートとかのひな型ファイルも一緒にあげたくて」
という場合、スプレッドシートをダウンロードしてEXCELで保持しておいてから
ドライブ上にスプレッドシートに戻す、という手法を取る場合は

以下の理由でおすすめしません。

・体裁がだいぶ崩れる
 (行幅、フォント、オートシェイプ)

・当然ですがGASは消える
タイムゾーンアメリカになる

※深い説明は省きます。


ドライブ間のファイルコピーがドライブ権限の問題で行えず、

仕方なくローカルにEXCELでダウンロードしてから
目的にドライブにアップするという手法を取ったスプレッドシートにおいて
時間の計算がめちゃくちゃになった、という方が
こちらを見ている場合は、速攻でタイムゾーンを疑ってみてください。
アメリカになっている場合は、

日本(Tokyo)のタイムゾーンGMT+0900)に戻してみてください。
解消するはずです。

 

ファイル→設定

よりご確認ください。

 

たくさんのフォルダを一気に作りたい場合は
ローカルでmkdirしたものをドライブにアップするのが一番よいと思います。

 

ここを見ているだいたいの方がやりたいのは

 

「フォルダにある複数のスプレッドシートに同じことをさせたいが
DriveAppが権限問題で使えないからハマっている」

 

んだと思うんですけど。

これはもう本当にせつない。

 

1つのスプレッドに対してやることがたくさんなのであれば
なおさらせつない。かといって手動でやる作業は増やしたくない。

 

あくまでも一例ですが、私が取った回避策は

①回避策用のスプレッドシートを用意する
②フォルダ内のスプレッドシートのURLを羅列しまくる(※)

③For文で②のスプレッドシートOpenByUrlを使って開く
④やりたい事をやらせる

 

※【追記】

URLの取り方なんですけど、ドライブのファイルをコピーして

そのままスプレッドシートに貼り付けると

ハイパーリンクになりますが、そのURLは

https://drive.google.com

で始まるのでOpenByUrlで使えません。

ハイパーリンクのURLをGASで取得した後に

https://docs.google.com

で始まるURLに置換が必要です。

(もちろんID後ろのcopyを/editに変えたりとかも必要)

 

こんな感じでURL貼って

f:id:m_millefeuille:20220316095949p:plain

こんな感じのベースファイル

 

こんな感じで開いてなんかさせると。


function myFunction() {
   var this_sheet = SpreadsheetApp.getActiveSpreadsheet();
   var base_sheet = this_sheet.getSheetByName("てすと");
   
   //ひとまずFor文でまわしておきますね
   for (i=1;i<=3;i++)
   {
       //ファイルのURL
       var target = base_sheet.getRange(i,2).getValue();

       //URLが記載されてなかった場合の保険
       if(target !=  "")
       {
         target_file = SpreadsheetApp.openByUrl(target);
         //開いたファイルについて好きなことさせましょ
       }
   }
}

こんな感じでした。フォルダ内のファイルが取れないなら

 

「取ったつもり」にすればいいじゃない


と、マリーアントワネットばりに考えました。

 

注意点を2つほど書きますので気を付けましょう。

・取得したURLには初期シート名を表す#gidが付いているが
 これを削除したいといった時に、/editを一緒に消してしまうと
 OpenByUrlでエラーになります

 /editは残しておきましょう。


・フォルダ内のファイル増減及びURLが変わるような編集については
(削除して作り直したとか) URLが変わりますので、

 適宜URLのメンテナンスが必要になるので台帳等の作成が

 推奨される面倒さがあります。

 

OpenByUrlについてはこちらを参照ください。

developers.google.com


まあ、権限つけてもらうのが一番いいんでしょうけど
なかなかつけてもらえませんよね、こういうヤツは。

 

 

こちらもいかがですか?

dヒッツやってみよう! 初回31日間無料の聴き放題サブスクをご紹介
お酒の備忘録 お酒の「あれなんだっけ?」のまとめ
画面キャプチャ 簡単にPC画面のキャプチャができる
GlobalIP グローバルIPを変えたくなったらやること