该项目从电子表格运行。它由两个函数组成(请参见下面的代码):第一个函数 getFilenames 清除名为“Rename”的工作表,设置列标题,并使用给定文件夹中的文件 ID 和文件名填充 A 列和 B 列。然后,用户将新文件名输入到 C 列并运行第二个函数“renameFiles”,该函数将重命名文件并向 D 列添加确认“已确认”。
这两个功能都可以完美运行。从用户的角度来看,这个脚本没有任何问题。所有文件的数据都被正确拉取,所有名称都被正确更改,并且每一行都正确收到确认“已确认”。
但是,执行日志却另有指示。每次我运行 renameFiles 时,它都会抛出此错误:“异常:在对象 DriveApp 上获取方法或属性 getFileById 时出现意外错误。 重命名文件 @ RenameFiles.gs:11"
function getFilenames (){
//UPDATE Folder ID before running
const parentFolderId = '<folder ID>';
//Clears sheet and sets up header row
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName ('Rename');
sheet.clear();
sheet.appendRow(['File ID','Old Name','New Name','Name updated?']);
//Pulls files from parent folder
const parentFolder = DriveApp.getFolderById(parentFolderId);
const queue = [{folder:parentFolder,parentName:''}];
while (queue.length >0){
const current = queue.shift();
const files = current.folder.getFiles();
while(files.hasNext()){
const file = files.next();
sheet.appendRow([file.getId(),file.getName()]);
}
}
}
function renameFiles() {
var s = SpreadsheetApp.openById("<spreadsheet ID>").getSheetByName('Rename');
// Starts at cell 2A and returns the number of rows with data and the number of columns with data
var dataRange = s.getRange(2,1,s.getLastRow(),s.getLastColumn()).getValues();
for (a = 0; a < dataRange.length; a++) {
var id = dataRange[a][0];
var newName = dataRange[a][2];
var filelocation = DriveApp.getFileById(id).setName(newName);
s.getRange(a+2,4).setValue("Confirmed");
SpreadsheetApp.flush();
}
资源: YouTube 视频“列出文件夹中的所有文件...”|堆栈查询:“重命名现有的谷歌驱动器文件夹名称”
我尝试摆弄for循环中的参数(将初始值更改为1,将条件中的逻辑更新为等于或小于等),但没有任何效果。有人可以帮助我理解为什么我会收到错误吗?
改变:
var dataRange = s.getRange(2,1,s.getLastRow(),s.getLastColumn()).getValues();
致:
var dataRange = s.getRange(2,1,s.getLastRow()-1,s.getLastColumn()).getValues();
说明:
记录
s.getRange(2,1,s.getLastRow(),s.getLastColumn()).getValues()
输出末尾带有空白数组元素的数据集。这是因为 s.getLastRow()
为您提供从工作表第一行开始的最后一行大小。
样品:
在此上下文中使用脚本
var range = sheet.getRange(2,1, sheet.getLastRow(), sheet.getLastColumn()).getValues();
会记录以下内容:
[ [ 'Test 1 ', 'Test 2', 'Test 3' ],
[ 'Test 1 ', 'Test 2', 'Test 3' ],
[ 'Test 1 ', 'Test 2', 'Test 3' ],
[ 'Test 1 ', 'Test 2', 'Test 3' ],
[ 'Test 1 ', 'Test 2', 'Test 3' ],
[ 'Test 1 ', 'Test 2', 'Test 3' ],
[ 'Test 1 ', 'Test 2', 'Test 3' ],
[ 'Test 1 ', 'Test 2', 'Test 3' ],
[ '', '', '' ] ]
由于在定义包括标题本身的行数时排除了范围内的标题,因此它将在末尾输出一个空白数组元素。
现在它输出错误
"Exception: Unexpected error while getting the method or property getFileById on object DriveApp. renameFiles @ RenameFiles.gs:11"
的原因是因为在循环的最后一个索引处,var id = dataRange[a][0];
没有值,因此方法DriveApp.getFileById(id)
会抛出异常错误。
参考: