
Microsoft 365 OneDrive for Business: Create Folder
Create a folder in the specified folder on OneDrive.
2020-07-02 (C) Questetra, Inc. (MIT License)
2020-07-02 (C) Questetra, Inc. (MIT License)
Configs
- C1: OAuth2 Setting Name *
- C2: Parent Folder URL (Root Folder if blank)
- C3: Folder Name to create * #{EL}
- C4: String type data Item that will save Folder 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
- This add-on is for OneDrive for Business of Microsoft 365. It does not work for OneDrive personal.
- To get URL of file/folder on OneDrive, open the Details window of the file/folder by clicking the Information icon, proceed to “More details”, and click the icon next to “Path”.
- If there are folder name conflicts, it returns error.