다른 폴더에있는 파일의 ID 가져 오기
이 스레드에 대한 후속 질문입니다 .
다른 폴더에있는 파일의 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);
}
이 코드는 파일이 폴더에있는 경우 제대로 작동하지만 하위 폴더 나 다른 폴더에서는 작동하지 않습니다.
아래는 제가 작업중인 시트입니다.

답변
이 경우 목표를 달성하기 위해 다음 흐름은 어떻습니까?
- 에있는 모든 파일의 파일 목록을 검색합니다
folderId
. - 스프레드 시트에 값을 입력하기위한 배열을 만듭니다.
스크립트를 수정하면 다음과 같이됩니다.
수정 된 스크립트 :
에서: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"열에 동일한 파일 이름이 존재하지 않는다고 가정합니다. 조심하세요.
여기에는 몇 가지 옵션이 있습니다. 먼저 DriveApp.getFoldersByName(name)주어진 이름과 일치하는 드라이브의 모든 폴더 목록을 반환 하는 방법이 있습니다. 물론 런타임 전에 폴더 이름을 알아야하며 동일한 이름의 다른 폴더를 가질 수 없습니다. 그렇지 않으면 위험합니다. 잘못된 폴더의 ID를 사용합니다.
폴더 트리 상위에있는 일부 폴더의 ID를 알고있는 경우 (예 : 위의 예에서 볼 수있는 스크립트 직접 상위, 참조 File.getParents())을 사용하여 위 방법의 영향을 제한 할 수 있습니다 Folder.getFoldersByName(name). 위와 동일한 제한이 여기에 적용되지만 더 빠르지 만 (반복 할 파일이 적음) 상위 폴더의 ID가 있어야합니다.
액세스 할 파일을 알고 있고 스크립트 실행 중에 일정하게 유지되는 경우 URL에서 폴더 ID를 복사하여 상수 변수로 저장할 수도 있습니다. 물론이 방법은 런타임 전에 파일을 구성해야하므로 더 엄격합니다. 그러나 명시 적으로 디렉토리 트리를 반복 할 필요가 없으므로 더 빠릅니다.