🍣

【GAS】共有ドライブ内に一括でフォルダ作成と権限付与

2023/09/09に公開

概要

  • Google Workspace のSpreadsheetでリスト化されているフォルダ名と権限設定を使って、フォルダをまるっと作っちゃう
  • フォルダの作成だけであれば300~350件程度であれば、5分半程度の実行時間で作成可能
    • 権限を付与する場合は200件程度に抑えた方が良さげ(検証なし)
  • 共有ドライブでなくても特定のフォルダ内に作成したい場合は利用可能(のはず)

Script

とりあえずスクリプト見てくれよ。(コードが汚いと思ったらいい感じに修正してください)

const foldersList = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('フォルダリスト');
const sharedDrive = DriveApp.getFolderById('フォルダのID'); 

function onOpen() {
  SpreadsheetApp.getUi ()
    .createMenu ('GAS')
    .addItem('フォルダ作成','createFolders')
    .addToUi ();
}

//Spreadsheetのフォルダ名取得
function getFolderNames(folderNamesColumn) {
  let lastRow =foldersList.getLastRow();
  let folderNames = foldersList.getRange(2,folderNamesColumn,lastRow-1,1).getValues();
  return folderNames;
}

//フォルダ作成
function createFolders() {
  let title = foldersList.getRange(1, 1, 1, foldersList.getLastColumn()).getValues().flat();
  console.log(title);
  
  //Spreadsheetのタイトルから列番号を取得
  const folderNamesColumn = title.indexOf('フォルダ名') + 1;
  const idColumn = title.indexOf('ID') + 1;
  const editerColumn = title.indexOf('外部ユーザ(投稿)') + 1;
  const viewerColumn = title.indexOf('外部ユーザ(閲覧)') + 1;
  
  if (folderNamesColumn==0 || idColumn==0){
    return Browser.msgBox('フォルダリストの列名が正しく設定されていません。');
  } else {
    let folderNames = getFolderNames(folderNamesColumn);

    //フォルダ作る → ID取得 → SpreadsheetへID記載 →  
    for (let i = 0; i < folderNames.length; i++) {
      let folderName = folderNames[i][0];
      
      if(sharedDrive.getFoldersByName(folderName).hasNext()){
        var folder = sharedDrive.getFoldersByName(folderName).next();
        //console.log(folder.hasNext());
        let folderId = folder.getId();
        foldersList.getRange(i+2,idColumn).setValue(folderId);
      }else{
        var folder = sharedDrive.createFolder(folderName);
        Utilities.sleep(1000);
        folder = sharedDrive.getFoldersByName(folderName).next();
        //console.log(folder);
        
        //IDの取得 → SpreadsheetへID記載
        let folderId = folder.getId();
        foldersList.getRange(i+2,idColumn).setValue(folderId);
      }
      //権限設定, ユーザは半角スペースで区切られていても空白でもOK
      let editors = foldersList.getRange(i+2,editerColumn).getValue().split(' ');
      let viewers = foldersList.getRange(i+2,viewerColumn).getValue().split(' ');
      if(editors != ''){
        folder.addEditors(editors);
      }
      if(viewers != ''){
        folder.addViewers(viewers);
      }
    }
  }
}

//フォルダのID取得
function getFolderId(folderName) {
  let folder = sharedDrive.getFoldersByName(folderName);
  return folder.getId();
}

補足

  • スクリプトの実行にはライブラリ Drive API を追加する必要あります。
  • 同一のフォルダ名がSpreadsheetに含まれている、もしくは作成したいフォルダ名が既に指定したフォルダ内に存在している場合、フォルダ作成と権限設定は実行されません。
    • フォルダ名からIDを検索しているため、スクリプト内で利用する関数や仕組みを変える他ないです。
  • Spreadsheet上の表はこんな感じになっています。
    • フォルダ名 | 外部ユーザ(投稿) | 外部ユーザ(閲覧) | ID

Discussion