首页 > 解决方案 > 用于检索要在 Google Sheet 数组中设置的 Google Drive 文档超链接的 Google 脚本

问题描述

我有一个 Google 表格,每个单元格中都有 Google Drive 文档名称。因此,每个单元格都包含一个 Google Drive 文档名称。各种单元一起形成一个阵列。

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

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

谷歌数组示例

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

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

标签: javascriptgoogle-apps-scriptgoogle-sheetsgoogle-drive-api

解决方案


解释:

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

我使用双映射方法来迭代每个单元格,这样做您不需要创建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);
}

推荐阅读