我的 Google Apps 脚本根据电子表格中的数据重命名文件夹中的所有文件。有人可以解释为什么它返回异常错误吗?

问题描述 投票:0回答:1

该项目从电子表格运行。它由两个函数组成(请参见下面的代码):第一个函数 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,将条件中的逻辑更新为等于或小于等),但没有任何效果。有人可以帮助我理解为什么我会收到错误吗?

google-sheets google-apps-script exception filenames
1个回答
0
投票

解决方案:

改变:

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)
会抛出异常错误。

参考:

https://developers.google.com/apps-script/reference/spreadsheet/sheet#getrangerow,-column,-numrows,-numcolumns

© www.soinside.com 2019 - 2024. All rights reserved.