在 Google Sheet 中获取 Google 驱动器文件路径

Fetch Google Drive File path in Google Sheet

想要获取 Google 驱动器文件路径,通过 文件名 使用 扩展名 搜索并在其他列中更新“驱动文件路径”

function onOpen() {
  let menu = SpreadsheetApp.getUi().createMenu("Copy Drive Path");
  menu.addItem ("CopyDPath","copypath");
  menu.addToUi();
}
//Copy Drive Path
function copypath() {
  // put your code here, want to search Drive path by searching through EXACT file name with Extension
}

获取 Link 选项如下所示

我相信你的目标如下。

  • 您想使用 .pdf 等扩展名搜索文件。
  • 您想检索 Google 驱动器上的文件名和文件路径。
  • 您想将它们放在“B”和“C”列中。
  • 您的文件存在于您的 Google 驱动器中。
  • 您想使用 Google Apps 脚本实现此目的。

在这种情况下,下面的示例脚本怎么样?

用法:

在此示例脚本中,使用了 Google Apps 脚本库。

1。安装 Google Apps 脚本库。

请安装FilesApp Google Apps Script library. You can see the method for installing it at here.

2。启用驱动器 API.

Please enable Drive API at Advanced Google services.

2。示例脚本:

请将以下脚本复制并粘贴到 Spreadsheet 的脚本编辑器中,设置您的 sheet 名称并保存脚本。

function copypath() {
  const sheetName = "Sheet1"; // Please set the sheet name.
  const extension = ".pdf"; // Please set the extension you expect.

  // 1. Retrieve folder structure from Google Drive.
  const res = FilesApp.getAllFoldersInFolder("root");
  const obj = res.name.reduce((o, e) => (o[e[e.length - 1]] = e.join("/"), o), {});

  // 2. Retrieve files by an extension and create an array for putting to Spreadsheet.
  const files = DriveApp.searchFiles(`title contains '${extension}' and trashed=false`); // or const files = DriveApp.searchFiles(`mimeType='application/pdf' and trashed=false`);
  const values = [];
  while (files.hasNext()) {
    const file = files.next();
    const filename = file.getName();
    if (filename.slice(-4).toLowerCase() == extension) {
      const parent = file.getParents();
      values.push([filename, obj[parent.hasNext() ? parent.next().getName() : ""] || "No parent"]);
    }
  }

  // 3. Put the array to Spreadsheet.
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  sheet.getRange(2, 2, values.length, 2).setValues(values);
}
  • 当这个脚本是运行时,下面的流程是运行.

    1. 从 Google 驱动器中检索文件夹结构。
      • 这里使用了 Google Apps 脚本库的 FilesApp。
    2. 通过扩展名检索文件并创建一个数组以放入 Spreadsheet。
    3. 将数组放在 Spreadsheet 上。
      • 检索到的值被放入列“B”和“C”。
  • 如果要检索PDF文件,也​​可以使用const files = DriveApp.searchFiles(`mimeType='application/pdf' and trashed=false`);代替const files = DriveApp.searchFiles(`title contains '${extension}' and trashed=false`);

注:

  • 这是一个简单的示例脚本。所以,请根据您的实际情况进行修改。

参考文献:

已添加:

根据您的回复,

No, this is not what I want. What I want is extract file path through File Name Search

如果要从 Spreadsheet 的“B”列检索文件名并检索文件路径,并且想将文件路径放在 Spread[=108] 的“C”列=],下面的示例脚本怎么样?

示例脚本:

function sample2() {
  const sheetName = "Sheet1"; // Please set the sheet name.

  // 1. Retrieve folder structure from Google Drive.
  const res = FilesApp.getAllFoldersInFolder("root");
  const obj = res.name.reduce((o, e) => (o[e[e.length - 1]] = e.join("/"), o), {});

  // 2. Retrieve filenames from Spreasheet.
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  const range = sheet.getRange("B2:B" + sheet.getLastRow());

  // 3. Retrieve the file path and create an array for putting to Spreadsheet.
  const values = range.getValues().map(filename => {
    const file = DriveApp.getFilesByName(filename);
    if (file.hasNext()) {
      const parent = file.next().getParents();
      return [obj[parent.hasNext() ? parent.next().getName() : ""] || "No parent"];
    }
    return ["File was not found."];
  });

  // 4. Put the array to Spreadsheet.
  range.offset(0, 1).setValues(values);
}

尝试

function copypath() {
  const sh = SpreadsheetApp.getActiveSheet()
  var data = sh.getDataRange().getValues()
  data.forEach((d, i) => { try { if (i > 0) d[2] = getPath(d[1]) } catch (e) { } })
  sh.getDataRange().setValues(data)
}
function getPath(fileNameWithExtension) {
  parents = DriveApp.getFileById(getFileId(fileNameWithExtension)).getParents()
  var path
  while (parents.hasNext()) {
    folder = parents.next();
    folderName = folder.getName();
    if (path == null) path = folderName;
    else path = folderName + '/' + path;
    parents = folder.getParents();
  }
  return path
}
function getFileId(name) {
  var files = DriveApp.getFilesByName(name);
  while (files.hasNext()) {
    var file = files.next();
    return (file.getId())
  }
}

参考资料

searchFiles()

getParents()

hasNext()

编辑

要获得可点击的 link,请尝试

function copypath() {
  const sh = SpreadsheetApp.getActiveSheet()
  var data = sh.getDataRange().getValues()
  data.forEach((d, i) => {
    try {
      if (i > 0) {
        var parents = DriveApp.getFileById(getFileId(d[1])).getParents()
        while (parents.hasNext()) {
          folder = parents.next();
          d[2] = folder.getUrl();
        }
      }
    } catch (e) { }
  })
  sh.getDataRange().setValues(data)
}
function getFileId(name) {
  var files = DriveApp.getFilesByName(name);
  while (files.hasNext()) {
    var file = files.next();
    return (file.getId())
  }
}

edit2

为每个文件检索link

function clickableLink() {
  const sh = SpreadsheetApp.getActiveSheet()
  var data = sh.getDataRange().getValues()
  data.forEach((d, i) => {
    try {
      if (i > 0) {
          d[2] = getFileUrl(d[1]);
      }
    } catch (e) { }
  })
  sh.getDataRange().setValues(data)
}
function getFileUrl(name) {
  var files = DriveApp.getFilesByName(name);
  while (files.hasNext()) {
    var file = files.next();
    return (file.getUrl())
  }
}