
Box: ファイルコピー (Box: Copy File)
この工程は、既存ファイルを複製し、指定フォルダに新規保存します。
Configs:共通設定
- 工程名
- メモ
Configs
- C1: OAuth2 設定 *
- C2: コピー元ファイルの ID
- C3: 保存先フォルダの ID (空白の場合、元ファイルと同じ場所に作成されます)
- C4: 新しいファイルのファイル名 (空白の場合、自動的に設定されます)#{EL}
- C5: ファイル ID を保存するデータ項目
- C6: ファイル URL を保存するデータ項目
Notes
- フォルダ ID は、URL に含まれています https://{sub-domain}.app.box.com/folder/(Folder ID)
- ファイル名やフォルダ名が競合(コンフリクト)する場合はエラーとなります
- Box のリフレッシュトークンには、期限があります
- 期限を超えないよう、定期的に利用する必要があります (Box: トークンおよびURLの有効期限)
Capture

See also
Script (click to open)
- 下記のスクリプトを記述した XML ファイルをダウンロードできます
- box-file-copy.xml (C) Questetra, Inc. (MIT License)
- Professional をご利用であればファイルの内容を改変することでオリジナルのアドオンとして活用できます
main();
function main(){
//// == Config Retrieving / 工程コンフィグの参照 ==
const oauth2 = configs.get( "conf_OAuth2" ) ;
const fileId = decideFileId();
if(fileId === "" || fileId === null){
throw "No Source File ID";
}
const newFileName = configs.get( "conf_NewFileName" );
checkNewFileName(newFileName);
let folderId = decideFolderId();
if(folderId === "" || folderId === null){
//空の場合は"元ファイルが配置されているフォルダ"とする when folder id isn't set, set "same folder"
folderId = getFolderID(oauth2, fileId);
}
const saveIdData = configs.getObject( "conf_DataForId" );
const saveUrlData = configs.getObject( "conf_DataForUrl" );
const newFileID = copyFile(oauth2, folderId, fileId, newFileName);
if (saveIdData !== null) {
engine.setData(saveIdData, newFileID);
}
if (saveUrlData !== null) {
engine.setData(saveUrlData, `https://app.box.com/file/${newFileID}`);
}
}
/**
* ファイルのIDをconfigから読み出して出力する。
* @return {String} ファイルの ID
*/
function decideFileId(){
let fileId = "";
const fileIdDef = configs.getObject("conf_SourceFileId");
if(fileIdDef === null){
fileId = configs.get( "conf_SourceFileId");
}else{
fileId = engine.findData(fileIdDef);
}
return fileId;
}
/**
* 新しいファイルのファイル名をチェックする。(サポートされていない文字が使われていないか)
*/
function checkNewFileName(newFileName){
//ファイル名が255文字を超えていないか
if(newFileName.length > 255){
throw "File Name should be less than 256 characters";
}
//ファイル名に「/」や「\」が含まれていないか
const reg = new RegExp('[/\\\\]');
if(newFileName.search(reg) !== -1) {
throw "Invalid File Name";
}
//ファイル名の先頭と末尾に半角スペースが使われていないか
if(newFileName.slice(0,1) === " " || newFileName.slice(-1) === " ") {
throw "Invalid File Name";
}
//ファイル名が「.」や「..」ではないか
if(newFileName === "." || newFileName === ".."){
throw "Invalid File Name";
}
}
/**
* フォルダのIDをconfigから読み出して出力する。
* @return {String} フォルダの ID
*/
function decideFolderId(){
let folderId = "";
const folderIdDef = configs.getObject("conf_FolderId");
if(folderIdDef === null){
folderId = configs.get( "conf_FolderId");
}else{
folderId = engine.findData(folderIdDef);
}
return folderId;
}
/**
* get parent folderID of file
* ファイルが配置されているフォルダのIDを取得する。
* @return {String} フォルダの ID
*/
function getFolderID(oauth2, fileId){
const url = `https://api.box.com/2.0/files/${fileId}`;
const response = httpClient.begin()
.authSetting(oauth2)
.queryParam("fields", "parent")
.get(url);
const status = response.getStatusCode();
const responseTxt = response.getResponseAsString();
if(status !== 200){
engine.log(responseTxt);
throw `Failed to get parent folder. status: ${status}`;
}
const jsonRes = JSON.parse(responseTxt);
return jsonRes.parent.id;
}
/**
* Box 上のファイルを指定フォルダに指定ファイル名でコピーする。
* @return {String} コピーしたファイルの ID
*/
//copy file on Box @return {String} ファイルの ID
function copyFile(oauth2, folderId, fileId, newFileName) {
let jsonReq = {};
jsonReq["parent"] = {"id": folderId };
if ( newFileName !== "" && newFileName !== null ){
jsonReq["name"] = newFileName;
}
const url = `https://api.box.com/2.0/files/${fileId}/copy`;
const response = httpClient.begin()
.authSetting(oauth2)
.queryParam("fields", "id")
.body(JSON.stringify(jsonReq), "application/json; charset=UTF-8")
.post(url);
const status = response.getStatusCode();
const responseTxt = response.getResponseAsString();
if (status !== 201) {
engine.log(responseTxt);
throw `Failed to copy. status: ${status}`;
}
const jsonRes = JSON.parse(responseTxt);
return jsonRes.id;
}