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_NAME
和 SHEET_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);
}
我有一个 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] );
}
};
您可以通过切换
将文件列表的位置更改为您想要的任何sheetvar ss = SpreadsheetApp.create(folderlisting);
到
var ss = SpreadsheetApp.openById('SHEET_ID').getSheetByName('SHEET_NAME');
.
不要忘记将 SHEET_NAME
和 SHEET_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);
}