Box: ファイルコピー (Box: Copy File)
既存ファイルを複製し、指定フォルダに新規保存します
2020-09-01 (C) Questetra, Inc. (MIT License)
Configs
  • C1: OAuth2設定名 *
  • C2: コピー元ファイルの ID
  • C3: 保存先フォルダの ID (空白の場合、元ファイルと同じ場所に作成されます)
  • C4: 新しいファイルのファイル名 (空白の場合、自動的に設定されます) #{EL}
  • C5: ファイル ID を保存する文字型データ項目
  • C6: ファイル URL を保存する文字型データ項目
Script
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);

  const token  = httpClient.getOAuth2Token( oauth2 );
  let folderId = decideFolderId();

  if(folderId === "" || folderId === null){
    //空の場合は"元ファイルが配置されているフォルダ"とする when folder id isn't set, set "same folder"
    folderId = getFolderID(token, fileId);
    }

  const saveIdData = configs.getObject( "conf_DataForId" );
  const saveUrlData = configs.getObject( "conf_DataForUrl" );


  const newFileID = copyFile(token, 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 shoule 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(token, fileId){

    const url = `https://api.box.com/2.0/files/${fileId}`;

    const response = httpClient.begin()
      .bearer(token)
      .get(url);

    const status = response.getStatusCode();
    const responseTxt = response.getResponseAsString();

    engine.log(`status: ${status}`);
    engine.log(responseTxt);

  let jsonRes;
   try {
     jsonRes = JSON.parse(responseTxt);
   } catch(e) {
     engine.log("failed to parse as json");
     throw `Failed to get parent folder and Failed to copy. status: ${status}`;
   }

    return jsonRes.parent.id;      
}


  //copy file on Box  @return {String}  ファイルの ID
function copyFile(token, 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()
    .bearer(token)
    .body(JSON.stringify(jsonReq), "application/json; charset=UTF-8")
    .post(url);

  const status = response.getStatusCode();
  const responseTxt = response.getResponseAsString();
  
  engine.log(`status: ${status}`);
  engine.log(responseTxt);

 let jsonRes;
 try {
   jsonRes = JSON.parse(responseTxt);
 } catch(e) {
   engine.log("failed to parse as json");
   throw `Failed to copy. status: ${status}`;
 }



if (status !== 201) {

    if (status === 409 && jsonRes["code"] === "item_name_in_use"){
         throw `Failed to copy . status: ${status}\n A file or folder with the same name already exists.`;
            }

    throw `Failed to copy. status: ${status}`;

   }


  return jsonRes.id;
}

Download

Capture

Notes

  1. フォルダ ID は、URL に含まれています。 https://{sub-domain}.app.box.com/folder/(Folder ID)
  2. ファイル名やフォルダ名が競合(コンフリクト)する場合はエラーとなります
  3. Box のリフレッシュトークンには、期限があります。期限を超えないよう、定期的に利用する必要があります。(2019 年 7 月時点で、60日。 https://box-content.readme.io/docs/oauth-20)
%d人のブロガーが「いいね」をつけました。