【GAS】GoogleドライブにあるフォルダとファイルがGoogle Apps Scriptに使用されているかどうかを確認する

Code

はじまり

135ml
135ml

Googleドライブにあるファイルを消そうとした時に、そのファイルがスクリプトで使用されていないかどうか気になったことはないですか?

リサちゃん
リサちゃん

うーん・・・ありませんね。

135ml
135ml

そうかそうか、やっぱりあるよな。

そこで今回は、指定したIDがスクリプトの中で使用されているかどうかを確認するツールを作りました。紹介します。

リサちゃん
リサちゃん

ありゃりゃ?

お・・・押忍っ! 宜しくおねがいしますっ!

ツールの概要

前回、自分がGoogle Apps Scriptで使用しているIDを管理するライブラリを作りました。

その過去の紹介記事は以下になります。

そして、今回はそのライブラリを使って、スクリプト内で指定したIDが各々のスクリプトの中で使用されているかどうかを確認するツールを作りました。

本ツールを実行して、指定したIDが使われている場合は、「ID: ‘XXXXXXXXXXXX’ is used.」といった具合にIDが使用されていることを知らせてくれます。

作る過程

それでは、本ツールの制作過程を紹介します。

IDの受け渡し部分の変更

まず、前回作った各スクリプトへのIDの受け渡し部分なのですが、返り値をObject型になるように変更します。各スクリプトでIDを取得する場合は、属性を指定して取得してもらうように変更します。

この属性名は、以前作成した関数名と揃えてソースの改編を楽にします。

function idObjForFunction(){
  let returnObj = {
    FOLDER_ID: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    , SHEET_ID: "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
  };
  return returnObj;
}

それに伴い、IDを受け取る部分も、以下のようにソースを変更します。

指定したIDがスクリプトの中で使用されているかどうかを確認する機能

1つのライブラリの中で各々のスクリプトで使用するIDを宣言する状態になりましたので、このライブラリ内で、指定したIDがスクリプトの中で使用されているかどうかを確認する機能を実装します。

ソース全体はこんな感じになっています。

function checkIdIsUsed(checkIdArray){
  let objsInTarget = [
    idObjForWebClipManager()
    , idObjForImageCroppingSheet()
    , idObjForLandmasterLibraryGas()
  ];
  let keys = [];
  let returnedId = "";
  let resultOfUsed = false;
  let isIdUsedArray = [];
  
  console.log(`checkIdIsUsed: print objsInTarget's elements: start --------------------------------------------------------`);
  console.log(objsInTarget);
  console.log(`checkIdIsUsed: print objsInTarget's elements: end --------------------------------------------------------`);
  
  for(let i = 0; i < checkIdArray.length; i++){
    resultOfUsed = false;
    for(let j = 0; j < objsInTarget.length; j++){
      console.log(objsInTarget[j]);
      keys = Object.keys(objsInTarget[j]);
      for(let k = 0; k < keys.length; k++){
        returnedId = objsInTarget[j][keys[k]];
        if(checkIdArray[i] === returnedId){
          resultOfUsed = true;
          break;
        }
      }
      if(resultOfUsed){
        break;
      }
    }
    isIdUsedArray.push(resultOfUsed);
  }
  return isIdUsedArray;
}

function main(){
  let checkIdArray = [
    "ID1"
    , "ID2"
  ];
  let isIdUsedArray = checkIdIsUsed(checkIdArray);
  let strIdUsed = " NOT";
  for(let i = 0; i < checkIdArray.length; i++){
    strIdUsed = " NOT";
    if(isIdUsedArray[i]){
      strIdUsed = "";
    }
    console.log(`ID: '${checkIdArray[i]}' is${strIdUsed} used.`);
  }
}

objsInTargetで、各スクリプトで使用するIDを宣言したオブジェクトを配列形式でリストアップします。

そして、引数で渡したcheckIdArrayにファイルIDやフォルダIDが指定されているので、objsInTarget内のオブジェクトのキーを全て走査し、指定したIDがobjsInTargetの中にあるかどうかを探索します。

IDが見つかったら、checkIdArrayと同じインデックスにtrueが格納されて、IDが無かったら、falseが格納されます。

IDが使用されているかどうかを表示

main()isIdUsedArrayに、trueかfalseを保持した配列が返ってきたので、そのboolean値によって、checkIdArray内で同じインデックスにあるIDが使用されているかどうかをconsole.logで表示します。

これで、本ツールの紹介は以上になります。

なぜ、この方法にしたのか

以前の記事では、本ライブラリのスクリプトファイルを指定して、それらをgrepしてIDを探索する方法を思いつきました。

しかし、なぜその方法を採用しなかったのかと言うと、

この機能を動かす動機としては、Googleドライブを操作しているときに発生します。

そのため、Googleドライブから本機能の実行までの動線を単純にするためには、grepの実行による方法を取るよりも、Google Apps Scriptのコンソールを開いて実行した方が確認作業が楽になるのではないかと考えました。

GitHub Actionsなどにいちいち移動するよりは、同じGoogle内のサービスで完結するほうが単純です。

以上、今回の方法を採用した理由でした。

おしまい

リサちゃん
リサちゃん

これで、フォルダやファイルを削除したことが原因でスクリプトが動かなくなる

みたいなことが無くなるね!

135ml
135ml

うむ。今回の大目的がまさしくそれだったから、よきかな!

以上になります!

コメント

タイトルとURLをコピーしました