Uzyskaj identyfikatory plików w różnych folderach

Nov 20 2020

To jest pytanie uzupełniające do tego wątku .

Czy istnieje sposób, aby uzyskać identyfikatory pliku w innym folderze? Poniżej znajduje się katalog tego, nad czym pracuję.

A to jest kod, którego używam.

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

Ten kod działa dobrze, jeśli pliki znajdują się w folderze, ale nie działa w przypadku podfolderów lub innego folderu.

Poniżej znajduje się arkusz, nad którym pracuję.

Odpowiedzi

1 Tanaike Nov 21 2020 at 02:10

W takim przypadku, aby osiągnąć swój cel, co z następującym przepływem?

  1. Pobierz listę wszystkich plików w formacie folderId.
  2. Utwórz tablicę do umieszczania wartości w arkuszu kalkulacyjnym.

Kiedy twój skrypt jest modyfikowany, wygląda to następująco.

Zmodyfikowany skrypt:

Od:
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()]);
    }
});
Do:
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] || ""]);

Uwaga:

  • W tym przypadku zakłada się, że te same nazwy plików nie istnieją w kolumnie „B” arkusza kalkulacyjnego. Proszę, uważaj na to.
1 puffin Nov 21 2020 at 02:15

Istnieje kilka opcji. Najpierw jest DriveApp.getFoldersByName(name)metoda, która zwróci listę wszystkich folderów na twoim dysku, które pasują do podanej nazwy Oczywiście będziesz musiał znać nazwę folderu przed uruchomieniem i nie możesz mieć innych folderów o tej samej nazwie, bo ryzykujesz pobranie identyfikatora niewłaściwego folderu.

Jeśli znasz identyfikator folderu znajdującego się wyżej w drzewie folderów (na przykład bezpośredniego rodzica skryptów, jak widać w powyższym przykładzie, zobacz File.getParents()), możesz ograniczyć wpływ powyższej metody za pomocą Folder.getFoldersByName(name). Obowiązują te same ograniczenia, co powyżej, ale będą szybsze (mniej plików do iteracji), ale wymaga posiadania identyfikatora folderu nadrzędnego.

Możesz również po prostu skopiować identyfikator folderu z adresu URL, jeśli wiesz, do którego pliku uzyskać dostęp i pozostanie niezmieniony podczas wykonywania skryptów, i zapisać go jako stałą zmienną. Ta metoda jest oczywiście bardziej sztywna, ponieważ musisz utworzyć plik przed uruchomieniem; jednakże nie będziesz musiał iterować otwartego drzewa katalogów i dzięki temu będzie szybszy.