Microsoft 365 OneDrive for Business: PDF作成
Microsoft 365 OneDrive for Business: Create PDF
この工程は、OneDrive 上のファイルをPDFに変換してデータ項目にセットします。
Configs for this Auto Step
- conf_OAuth2
- C1: OAuth2 設定 *
- conf_Url
- C2: PDFに変換するファイルのURL *
- conf_FileName
- C3: データ項目に保存するPDFファイルのファイル名 *#{EL}
- conf_FileData
- C4: PDFファイルを保存するデータ項目 *
Script (click to open)
// 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/";
/**
* PDFファイルに変換してダウンロード
* 参考)https://learn.microsoft.com/ja-jp/graph/api/driveitem-get-content-format?view=graph-rest-1.0
*/
main();
function main(){
//// == 工程コンフィグの参照 / Config Retrieving ==
const oauth2 = configs.get("conf_OAuth2");
const fileUrl = retrieveFileUrl();
const fileName = configs.get("conf_FileName");
const fileDataDef = configs.getObject("conf_FileData");
//// == ワークフローデータの参照 / Data Retrieving ==
const files = engine.findData( configs.getObject("conf_Url") );
if (files === null) {
engine.setData(fileDataDef, [""]);
return;
}
//// == 演算 / Calculating ==
// ファイルURLよりファイル情報を取得 / Get file information from file URL
const fileInfo = getFileInfoByUrl( fileUrl, oauth2 );
// APIよりPDFファイルを取得 / Get PDF files from API
const httpResponse = downloadPDFFileRequest(fileInfo, oauth2);
// データ項目が空の場合、変数を初期化 / If data item is empty, initialize variable.
let filesAttached = engine.findData( fileDataDef ); // java.util.ArrayList
if( filesAttached === null ) {
engine.log( "AutomatedTask FilesArray {C4} (empty)" );
filesAttached = new java.util.ArrayList();
}else{
engine.log( "AutomatedTask FilesArray {C4}: " + filesAttached.size() + " files" );
}
// データ項目にレスポンスデータをセット / Set response data to data items
const fileTmp = new com.questetra.bpms.core.event.scripttask.NewQfile(
fileName, httpResponse.getContentType(), httpResponse.getResponse()
);
filesAttached.add( fileTmp );
engine.setData( fileDataDef , filesAttached );
}
/**
* configからファイルURLの値を読み出す
* @return {String} configの値
*/
function retrieveFileUrl() {
const fileUrlDef = configs.getObject( "conf_Url" );
let fileUrl;
if ( fileUrlDef === null ) {
fileUrl = configs.get( "conf_Url" )
}else{
fileUrl = engine.findData( fileUrlDef );
}
if ( fileUrl === "" || fileUrl === null){
throw "File URL is empty."
}
return fileUrl;
}
/**
* フォルダの URL からファイル情報(ドライブ ID とファイル ID)を取得し、
* オブジェクトで返す(URL が空の場合はエラーとする)
* @param {String} fileUrl フォルダの URL
* @param {String} oauth2 OAuth2 設定
* @return {Object} fileInfo ファイル情報 {driveId, fileId}
*/
function getFileInfoByUrl( fileUrl, oauth2 ) {
let fileInfo;
if ( fileUrl !== "" && fileUrl !== null ) {
// 分割代入
const {
id,
parentReference: {
driveId
}
} = getObjBySharingUrl( fileUrl, oauth2 );
fileInfo = {driveId: `drives/${driveId}`, fileId: id};
}
return fileInfo;
}
/**
* 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} oauth2 OAuth2 設定
* @return {Object} responseObj ドライブアイテムのメタデータの JSON オブジェクト
*/
function getObjBySharingUrl( sharingUrl, oauth2 ) {
if (sharingUrl === "" || sharingUrl === null) {
throw `Sharing URL is empty.`;
}
// encoding sharing URL
const encodedSharingUrl = encodeSharingUrl(sharingUrl);
// API Request
const response = httpClient.begin()
.authSetting( oauth2 )
.get( `${GRAPH_URI}shares/${encodedSharingUrl}/driveItem` );
const responseStr = logAndJudgeError(response, "GET");
return JSON.parse( responseStr );
}
/**
* 共有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);
}
return `u!${encodedSharingUrl}`;
}
/**
* FileInfoを元にPDFファイル形式で指定ファイルを取得する
* @param {String} fileInfo ダウンロード元アイテム情報 {driveId, id}
* @param {String} oauth2 OAuth2 認証設定
* @return {HttpResponseWrapper} response レスポンス
*/
function downloadPDFFileRequest(fileInfo, oauth2) {
// Request PATH
const apiUri = `${GRAPH_URI}${fileInfo.driveId}/items/${fileInfo.fileId}/content?format=pdf`;
// API Request
const response = httpClient.begin() // HttpRequestWrapper
.authSetting( oauth2 ) // Request HEADER (OAuth2 Token)
.get( apiUri ); // HttpResponseWrapper
const httpStatus = response.getStatusCode();
if (httpStatus >= 300) {
const accessLog = `---GET request--- ${httpStatus}\n${response.getResponseAsString()}\n${fileInfo.driveId}\n${fileInfo.fileId}\n${apiUri}`;
engine.log(accessLog);
throw `Failed to download for PDF File. status: ${httpStatus}`;
}
return response;
}
/**
* ログの出力と、エラー発生時のスローを行う
* @param {HttpResponseWrapper} response リクエストの応答
* @param {String} requestType リクエストをどの形式で行ったか("GET" or "POST" or "PATCH")
* @return {String} responseStr レスポンスの文字列
*/
function logAndJudgeError(response, requestType){
const responseStr = response.getResponseAsString();
const status = response.getStatusCode();
if(status >= 300){
const accessLog = `---${requestType} request--- ${status}\n${responseStr}\n`;
engine.log(accessLog);
throw `Failed in ${requestType} request. status: ${status}`;
}
return responseStr;
}
Download
- onedrive-file-download-pdf.xml
- 2024-08-01 (C) Questetra, Inc. (MIT License)
自由改変可能な JavaScript (ECMAScript) コードです。いかなる保証もありません。
(アドオン自動工程のインストールは Professional editionでのみ可能です)
(アドオン自動工程のインストールは Professional editionでのみ可能です)
Notes
- Microsoft365 系のサービスとの連携設定について
- Microsoft365(Azure Active Directory)側のアプリケーション登録の方法
- Questetra 側の HTTP 認証設定の方法
- “OneDrive へクラウドワークフロー Questetra からファイル出力する方法”
- “2.2: Questetra 側の OAuth 設定”
- ※注意※ Excel Online ファイルが SharePoint Online(SPO)のドキュメントライブラリ上にある場合、指定すべきスコープが異なる
- SPOドキュメントライブラリ上ではない →https://graph.microsoft.com/Files.ReadWrite offline_access
- SPOドキュメントライブラリ上にある →https://graph.microsoft.com/Sites.ReadWrite.All offline_access
- “OneDrive へクラウドワークフロー Questetra からファイル出力する方法”
- シート名にカッコ等の記号が入っている場合にはエラーになることがあります。エラーとなった場合にはシート名の変更を検討してください。
Capture

