다른 폴더에있는 파일의 ID 가져 오기

Nov 20 2020

이 스레드에 대한 후속 질문입니다 .

다른 폴더에있는 파일의 ID를 얻을 수있는 방법이 있습니까? 아래는 내가 작업중인 디렉토리입니다.

이것이 제가 사용하고있는 코드입니다.

function myFunction() {
  const ss = SpreadsheetApp.getActive();
  
  var SSID =  ss.getId(); //sheet id
  var spreadsheetFile =  DriveApp.getFileById(SSID);
  var folderId = spreadsheetFile.getParents().next().getId();
  
  const sh = ss.getSheetByName('Sheet4'); // change that to the name of your sheet
  const filenames = sh.getRange('B3:B').getValues().flat().filter(r=>r!='');
  const IDs = [];
  const Folder = DriveApp.getFolderById(folderId);
  
  filenames.forEach(fn=>{
      let Files = Folder.getFilesByName(fn);
      while(Files.hasNext()){
          let file = Files.next();
          IDs.push([file.getId()]);
      }
  });
  sh.getRange(3,3,IDs.length,1).setValues(IDs);
}

이 코드는 파일이 폴더에있는 경우 제대로 작동하지만 하위 폴더 나 다른 폴더에서는 작동하지 않습니다.

아래는 제가 작업중인 시트입니다.

답변

1 Tanaike Nov 21 2020 at 02:10

이 경우 목표를 달성하기 위해 다음 흐름은 어떻습니까?

  1. 에있는 모든 파일의 파일 목록을 검색합니다 folderId.
  2. 스프레드 시트에 값을 입력하기위한 배열을 만듭니다.

스크립트를 수정하면 다음과 같이됩니다.

수정 된 스크립트 :

에서:
const IDs = [];
const Folder = DriveApp.getFolderById(folderId);

filenames.forEach(fn=>{
    let Files = Folder.getFilesByName(fn);
    while(Files.hasNext()){
        let file = Files.next();
        IDs.push([file.getId()]);
    }
});
에:
const Folder = DriveApp.getFolderById(folderId);

// 1. Retrieve the file list of all files in `folderId`.
const getFileList = (f, folders = [], fileList = {}) => {
  const fs = f.getFiles();
  while (fs.hasNext()) {
    const file = fs.next()
    fileList[file.getName()] = file.getId();
  }
  const fols = f.getFolders();
  const folderObjs = [];
  while (fols.hasNext()) folderObjs.push(fols.next());
  if (folderObjs.length > 0) {
    folders.push(folderObjs);
    folderObjs.forEach(fol => getFileList(fol, folders, fileList));
  }
  return fileList;
};
const fileList = getFileList(Folder);

// 2. Create an array for putting values to Spreadsheet.
const IDs = filenames.map(fn => [fileList[fn] || ""]);

노트 :

  • 이 경우 스프레드 시트의 "B"열에 동일한 파일 이름이 존재하지 않는다고 가정합니다. 조심하세요.
1 puffin Nov 21 2020 at 02:15

여기에는 몇 가지 옵션이 있습니다. 먼저 DriveApp.getFoldersByName(name)주어진 이름과 일치하는 드라이브의 모든 폴더 목록을 반환 하는 방법이 있습니다. 물론 런타임 전에 폴더 이름을 알아야하며 동일한 이름의 다른 폴더를 가질 수 없습니다. 그렇지 않으면 위험합니다. 잘못된 폴더의 ID를 사용합니다.

폴더 트리 상위에있는 일부 폴더의 ID를 알고있는 경우 (예 : 위의 예에서 볼 수있는 스크립트 직접 상위, 참조 File.getParents())을 사용하여 위 방법의 영향을 제한 할 수 있습니다 Folder.getFoldersByName(name). 위와 동일한 제한이 여기에 적용되지만 더 빠르지 만 (반복 할 파일이 적음) 상위 폴더의 ID가 있어야합니다.

액세스 할 파일을 알고 있고 스크립트 실행 중에 일정하게 유지되는 경우 URL에서 폴더 ID를 복사하여 상수 변수로 저장할 수도 있습니다. 물론이 방법은 런타임 전에 파일을 구성해야하므로 더 엄격합니다. 그러나 명시 적으로 디렉토리 트리를 반복 할 필요가 없으므로 더 빠릅니다.