Dapatkan ID file di folder yang berbeda

Nov 20 2020

Ini adalah pertanyaan lanjutan untuk utas ini .

Apakah ada cara bagi saya untuk mendapatkan ID file di folder lain? Di bawah ini adalah direktori yang sedang saya kerjakan.

Dan inilah kode yang saya gunakan.

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);
}

Kode ini berfungsi dengan baik jika file berada di folder, tetapi tidak berfungsi untuk subfolder atau folder lain.

Di bawah ini adalah lembar yang sedang saya kerjakan.

Jawaban

1 Tanaike Nov 21 2020 at 02:10

Dalam hal ini, untuk mencapai tujuan Anda, bagaimana dengan aliran berikut?

  1. Ambil daftar file dari semua file di folderId.
  2. Buat larik untuk meletakkan nilai ke Spreadsheet.

Ketika skrip Anda diubah, menjadi sebagai berikut.

Skrip yang dimodifikasi:

Dari:
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()]);
    }
});
Untuk:
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] || ""]);

catatan:

  • Dalam kasus ini, anggaplah bahwa nama file yang sama tidak ada di kolom "B" pada Spreadsheet. Harap berhati-hati ini.
1 puffin Nov 21 2020 at 02:15

Ada beberapa opsi di sini. Pertama ada DriveApp.getFoldersByName(name)metode yang akan mengembalikan daftar semua folder di drive Anda yang sesuai dengan nama yang diberikan. Anda tentu saja perlu mengetahui nama folder sebelum runtime dan Anda tidak dapat memiliki folder lain dengan nama yang sama, atau Anda berisiko mengambil id dari folder yang salah.

Jika Anda mengetahui id dari beberapa folder yang lebih tinggi dari pohon folder (seperti skrip induk langsung seperti yang terlihat pada contoh di atas, lihat File.getParents()) Anda dapat membatasi dampak dari metode di atas dengan menggunakan Folder.getFoldersByName(name). Pembatasan yang sama seperti di atas berlaku di sini, tetapi akan lebih cepat (lebih sedikit file untuk diiterasi), tetapi mengharuskan Anda memiliki id folder induk.

Anda juga dapat menyalin id folder dari url jika Anda mengetahui file mana yang akan diakses dan akan tetap konstan selama eksekusi skrip, dan menyimpannya sebagai variabel konstan. Metode ini tentu saja lebih kaku karena Anda harus membuat file sebelum runtime; namun, Anda tidak perlu mengulang pohon direktori secara terbuka dan karena itu akan lebih cepat.