Google 检索 Google 驱动器文档超链接的脚本将设置在 Google Sheet 数组中

Google script to retrieve Google Drive documents hyperlink to be set in a Google Sheet array

我有一个 Google Sheet,每个单元格中有 Google 个驱动器文档名称。因此每个单元格都包含一个 Google 云端硬盘文档名称。各种单元格一起形成一个数组。

我正在尝试根据每个 Google Sheet 单元格中的名称检索这些 Google Drive 文档的超链接,并在每个单元格中设置这些超链接(通过替换文档每个单元格中的名称)。 请注意,Google 个驱动器文件不在相同的 Google 个驱动器文件夹中。

我设法修改了现有代码,使其在我的上下文中工作;但是,它仅适用于 1 列数组。当我尝试将范围扩展到多个列时,所有超链接 return“未定义”url(即使对于之前工作的第一列也是如此)。

Google array example

看下面我的代码。任何帮助将非常感激。非常感谢。

function getFile() {

const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet1 = ss.getSheetByName('Sheet1');

var lastRow = sheet1.getLastRow();

var range = sheet1.getRange(2,1,lastRow - 1,4);
var names = range.getValues();

var nameUrl ={};

for (let i in names) {

var files = DriveApp.getFilesByName(names[i]);

while (files.hasNext()) {
 var file = files.next();
 var fullName = file.getName();
 var url = file.getUrl();
 nameUrl[fullName] = url;
 }
 }

var links = names.map(function(e) {
  return [
    '=HYPERLINK("' + nameUrl[e] + '","' + e + '")'
      ];
});
range.setValues(links);
}

试试下面的脚本。它会找到您想要的文件夹并按文件、名称和 URL:

列出内容
// replace your-folder below with the folder for which you want a listing
function listFolderContents() {
  var foldername = 'your-folder';
  var folderlisting = 'listing of folder ' + foldername;
  
  var folders = DriveApp.getFoldersByName(foldername)
  var folder = folders.next();
  var contents = folder.getFiles();
  
  var ss = SpreadsheetApp.create(folderlisting);
  var sheet = ss.getActiveSheet();
  sheet.appendRow( ['name', 'link'] );
  
  var file;
  var name;
  var link;
  var row;
  while(contents.hasNext()) {
    file = contents.next();
    name = file.getName();
    link = file.getUrl();
    sheet.appendRow( [name, link] );     
  }  
};

您可以通过切换

将文件列表的位置更改为您想要的任何sheet

var ss = SpreadsheetApp.create(folderlisting);

var ss = SpreadsheetApp.openById('SHEET_ID').getSheetByName('SHEET_NAME');.

不要忘记将 SHEET_NAMESHEET_ID 更改为与您的价差相匹配的 sheet。

解释:

  • 您已经非常接近了,但是您的代码适用于一列的二维数组,您需要重新设计您的代码以处理多列的二维数组。

我使用双重 map 方法对每个单元格进行迭代,这样您就不需要创建对象 nameUrl,这也会降低您的代码速度。

解决方案:

function getFile() {   
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet1 = ss.getSheetByName('Sheet1');
  const lastRow = sheet1.getLastRow();
  const range = sheet1.getRange(2,1,lastRow - 1,4);
  const names = range.getValues();
  const data = names.map(r=>r.map(c=>{
    let files = DriveApp.getFilesByName(c);
    while (files.hasNext()) {
      var file = files.next();
      var url = file.getUrl();
      return c!=''?'=HYPERLINK("' + url + '","' + c + '")':'';
    }}));
  range.setValues(data);
}