我正在尝试获取仅具有Google云端硬盘URL的文件的文件名。我目前正在使用Google Sheets regexextract函数从URL中提取文件ID,然后使用脚本根据ID查找文件,但希望在脚本中进行正则表达式。
我浏览了这里的各种帖子,以期弄清运气。希望有人可以说明我在尝试使用正则表达式时做错了什么。
var sheet = SpreadsheetApp.getActive().getSheetByName("Test1");
var link1 = sheet.getRange("N2:N").getValues();
var regex_ids = new RegExp("/file/d/[a-zA-Z0-9]g");
var links = regex_ids.exec(link1);
var filenames = [];
for (var i = 0; i < links.length; i++) {
var url = links[i][0];
if (url != "") {
var filename = DriveApp.getFileById(links[i][0]).getName();
filenames.push([filename]);
}
}
var startRow = 2; // print in row 2 since row 1 is the header row
var fileNameColumn = 18; // Column B = column 2
var destination = sheet.getRange(startRow, fileNameColumn, filenames.length, filenames[0].length);
destination.setValues(filenames);
}
当前,由于正则表达式配置不正确,我陷入了错误“ TypeError:无法从空读取属性“ length”(第7行,文件“ Code”)”。
答案 0 :(得分:1)
无效的语法:
Regexp()
接受一个正则表达式字符串和一个标志字符串作为参数,而代码提供了一个串联的正则表达式标志字符串。 exec()
接受字符串参数,而代码提供2D数组。 正则表达式不足:
_
。 ()
ID。提供的正则表达式还捕获/file/d
+
var link1 = sheet.getRange("N2:N" + sheet.getLastRow()).getValues();//modified
var regex_ids = /\/file\/d\/([^\/]+)/;//or new RegExp("/file/d/([a-zA-Z0-9_]+)","g");() =capture ids
//var links = regex_ids.exec(link1);
var filenames = [];
for (var i = 0; i < link1.length; i++) {//modified;loop through values2D array
var url = link1[i][0];//modified;
var preId = regex_ids.exec(url);//added;
var id;
if (preId && (id=preId[1])) {//modified; [1] = first capture group
var filename = DriveApp.getFileById(id).getName();//modified
filenames.push([filename]);
} else {
filenames.push([""]);
}
}