Microsoft 365 OneDrive for Business: フォルダ作成 (Microsoft 365 OneDrive for Business: Create Folder)
OneDrive の指定フォルダ内にフォルダを作成します。
2020-07-02 (C) Questetra, Inc. (MIT License)
Configs
  • C1: OAuth2 設定名 *
  • C2: 作成するフォルダの親フォルダの URL (空白の場合、ルートフォルダ)
  • C3: 作成するフォルダの名称 * #{EL}
  • C4: フォルダ URL を保存する文字型データ項目
Script
// OAuth2 config sample at [OAuth 2.0 Setting]
// - Authorization Endpoint URL: https://login.microsoftonline.com/common/oauth2/v2.0/authorize
// - Token Endpoint URL: https://login.microsoftonline.com/common/oauth2/v2.0/token
// - Scope: https://graph.microsoft.com/Files.ReadWrite.All offline_access
// - Consumer Key: (Get by Microsoft Azure Active Directory)
// - Consumer Secret: (Get by Microsoft Azure Active Directory)

const GRAPH_URI = "https://graph.microsoft.com/v1.0/";

main();
function main(){
  //// == 工程コンフィグの参照 / Config Retrieving ==
  const oauth2 = configs.get("conf_OAuth2");
  const parentFolderUrl = retrieveParentFolderUrl();
  const folderName = retrieveFolderName();
  const urlDataDef = configs.getObject("conf_folderUrl");
  //// == ワークフローデータの参照 / Data Retrieving ==
  const token = httpClient.getOAuth2Token( oauth2 );

  //// == 演算 / Calculating ==
  const parentFolderInfo = getFolderInfoByUrl( parentFolderUrl, token );
  const createdFolderUrl = createFolder( parentFolderInfo, folderName, token );

  //// == ワークフローデータへの代入 / Data Updating ==
  setData( urlDataDef, createdFolderUrl );
}

/**
  * configから値を読み出し、必要に応じて値チェックを行った後、値を返す
  * @return {String} configの値
  */
function retrieveParentFolderUrl() {
  const folderUrlDef = configs.getObject( "conf_parentFolderUrl" );
  let folderUrl = configs.get( "conf_parentFolderUrl" );
  if ( folderUrlDef !== null ) {
    folderUrl = engine.findData( folderUrlDef );
  }
  return folderUrl;
}

function retrieveFolderName() {
  const folderName = configs.get( "conf_folderName" );
  if ( folderName === "" || folderName === null ) {
    throw `Folder name is empty.`;
  }
  return folderName;
}

/**
  * フォルダのURLからフォルダ情報(ドライブIDとフォルダID)を取得し、
  * オブジェクトで返す(URLが空の場合はドライブIDをme/drive、フォルダIDをrootにする)
  * @param {String} folderUrl  フォルダのURL
  * @param {String} token  OAuth2 トークン
  * @return {Object} folderInfo  フォルダ情報 {driveId, folderId}
  */
function getFolderInfoByUrl( folderUrl, token ) {
  let folderInfo = {driveId: "me/drive", folderId: "root"};
  if ( folderUrl !== "" && folderUrl !== null ) {
    // 分割代入
    const {
      id,
      parentReference: {
        driveId
      }
    } = getObjBySharingUrl( folderUrl, token );
    folderInfo = {driveId: `drives/${driveId}`, folderId: id};
  }
  return folderInfo;
}

/**
  * OneDriveのドライブアイテム(ファイル、フォルダ)のメタデータを取得し、JSONオブジェクトを返す
  * APIの仕様:https://docs.microsoft.com/ja-jp/onedrive/developer/rest-api/api/shares_get?view=odsp-graph-online
  * @param {String} sharingUrl  ファイルの共有URL
  * @param {String} token  OAuth2 トークン
  * @return {Object} responseObj  ドライブアイテムのメタデータのJSONオブジェクト
  */
function getObjBySharingUrl( sharingUrl, token ) {
  if (sharingUrl === "" || sharingUrl === null) {
    throw `Sharing URL is empty.`;
  }

  // encoding sharing URL
  const encodedSharingUrl = encodeSharingUrl(sharingUrl);

  // preparing for API Request
  let apiRequest = httpClient.begin(); // HttpRequestWrapper
  // com.questetra.bpms.core.event.scripttask.HttpClientWrapper
  // Request HEADER (OAuth2 Token, HTTP Basic Auth, etc)
  apiRequest = apiRequest.bearer( token );
  // Access to the API (POST, GET, PUT, etc)
  let response = apiRequest.get( `${GRAPH_URI}shares/${encodedSharingUrl}/driveItem` ); // HttpResponseWrapper
  const httpStatus = response.getStatusCode();
  const accessLog = `---GET request--- ${httpStatus}\n${response.getResponseAsString()}\n`;
  engine.log(accessLog);
  if (httpStatus >= 300) {
    const error = `Failed to get drive item. status: ${httpStatus}`;
    throw error;
  }
  const responseObj = JSON.parse( response.getResponseAsString() );
  return responseObj;
}

/**
  * 共有URLをunpadded base64url 形式にエンコードする
  * @param {String} sharingUrl  共有URL
  * @return {String} encodedSharingUrl  エンコードされた共有URL
  */
function encodeSharingUrl( sharingUrl ) {
  let encodedSharingUrl = base64.encodeToUrlSafeString( sharingUrl );
  while ( encodedSharingUrl.slice(-1) === '=' ) {
    encodedSharingUrl = encodedSharingUrl.slice(0,-1);
  }
  encodedSharingUrl = "u!" + encodedSharingUrl;
  return encodedSharingUrl;
}

/**
  * フォルダを作成する
  * @param {String,String} driveId,folderId  親フォルダのドライブID、フォルダID
  * @param {String} folderName  作成するフォルダの名前
  * @param {String} token  OAuth2 トークン
  * @return {String}  作成したフォルダの URL
  */
function createFolder( {
  driveId,
  folderId
}, folderName, token ){
  const url = `${GRAPH_URI}${driveId}/items/${folderId}/children`;
  const body = {
    "name": folderName,
    "folder":{},
    "@microsoft.graph.conflictBehavior": "fail"
    //重複時の振る舞いを決めること
  }
  let response = httpClient.begin()
    .bearer(token)
    .body(JSON.stringify(body), "application/json; charset=UTF-8")
    .post(url);
  //when error thrown
  const responseJson = response.getResponseAsString();
  const status = response.getStatusCode();
  const accessLog = `---POST request--- ${status}\n${responseJson}\n`;
  engine.log(accessLog);
  if (status >= 300) {
    throw `Failed to create: ${folderName}. status: ${status}`;
  }
  const json = JSON.parse(responseJson);
  return json.webUrl;
}

/**
  * データ項目に出力する
  * @param {ProcessDataDefinitionView} dataDef  データ項目の ProcessDataDefinitionView
  * @param {String} dataString  出力する文字列
  */
function setData( dataDef, dataString ){
  if(dataDef !==  null){
    engine.setData( dataDef, dataString );
  }
}

Download

Capture

Notes

  1. Microsoft 365 の OneDrive for Business で使用できるアドオンです。個人用の OneDrive では使用できません。
  2. ファイルやフォルダの URL は、OneDrive でファイルやフォルダの詳細ウィンドウ(右上のiのアイコン)から「その他の詳細」へ進み、「パス」の隣のアイコンから取得します。(上部メニューの「共有」や「リンクのコピー」から取得した URL も使用できます)
    ファイル、フォルダURLの取得方法
  3. ファイル名が競合(コンフリクト)する場合は、エラーとなります。
%d人のブロガーが「いいね」をつけました。