【问题标题】:Need help debugging Google Apps Script code intended to update hundreds of files in Google Drive需要帮助调试旨在更新 Google Drive 中数百个文件的 Google Apps 脚本代码
【发布时间】:2021-03-19 15:33:28
【问题描述】:

我工作的公司刚刚更新了品牌,影响了保存到共享 Google 云端硬盘的数百个 Excel 和 PowerPoint 文件。有一个团队正在更新文件。我的挑战是找到一种有效的方法来添加新文件和删除 Google Drive 中的旧文件。

我创建了一个 Google 表格来捕获当前文件 ID、新文件 ID 和文件夹 ID,以及以下 Google Apps 脚本代码。代码抛出以下错误。

异常:获取对象 DriveApp 上的方法或属性 getFileById 时出现意外错误。
批量更新@批量更新.gs:25

希望有人可以帮我调试吗?我是新手,我碰壁了。

function BulkUpdate() {
  
  // This constant is added to updated files
  var success = "Success"

  // Define range 
  var sheet = SpreadsheetApp.getActiveSheet();
  var firstRow = 2; // First row of data to process
  var lastRow = sheet.getLastRow(); // Last row of data to process

  // Fetch range
  var dataRange = sheet.getRange(firstRow, 1, lastRow, 4);

  // Fetch values for each row in range
  var data = dataRange.getValues();
  for (var i = 0; data.length; ++i) {
    var row = data[i];
    var folderId = row[0]; // First column
    var currentFileId = row[1]; // Second column
    var newFileId = row[2]; // Third column
    var confirmation = row[3]; // Fourth column

    // Copy new file to folder and trash current file
    if (confirmation !== success) {
      var currentFile = DriveApp.getFileById(currentFileId);
      var newFile = DriveApp.getFileByID(newFileId);
      var folder = DriveApp.getFolderById(folderId);
      newFile.makeCopy(folder);
      currentFile.setTrashed(true);

      // Update spreadsheet
      sheet.getRange(firstRow + i, 4).setValue(success);
      SpreadsheetApp.flush();
    }
  }
  
  // Create a popup window
  SpreadsheetApp.getUi().alert("Updates Complete");
}

【问题讨论】:

  • 我了解到您在第 25 行修复了骆驼案,更改后您遇到的错误是什么?

标签: google-apps-script google-sheets google-drive-shared-drive


【解决方案1】:

谢谢大家。原来我需要在定义“dataRange”时从lastRow 中减去一个。您将在下面找到最终代码以供参考。

function onOpen() {
  var sheet = SpreadsheetApp.getActive();
  var menuItems = [{name: 'Update Google Drive', functionName: 'bulkUpdate'}];
  sheet.addMenu('Menu', menuItems);
}

function bulkUpdate() {
  
  // This constant is added to updated files
  var success = "Success"

  // Define range 
  var sheet = SpreadsheetApp.getActiveSheet();
  var firstRow = 2; // First row of data to process
  var firstColumn = 1; // First column of data to process
  var lastRow = sheet.getLastRow(); // Last row of data to process
  var lastColumn = 6; // Last column of data to process

  // Fetch range
  var dataRange = sheet.getRange(firstRow, firstColumn, lastRow - 1, lastColumn);

  // Fetch values for each row in range
  var data = dataRange.getValues();
  for (i = 0; i < data.length; i++) {
    var row = data[i];
    var folderId = row[1]; // Second column
    var currentFileId = row[3]; // Fourth column
    var newFileId = row[4]; // Fifth column
    var confirmation = row[5]; // Sixth column

    // Copy new file to folder and trash current file
    if (confirmation !== success) {
      var currentFile = DriveApp.getFileById(currentFileId);
      var newFile = DriveApp.getFileById(newFileId);
      var folder = DriveApp.getFolderById(folderId);
      newFile.moveTo(folder);
      currentFile.setTrashed(true);

      // Update spreadsheet
      sheet.getRange(firstRow + i, 6).setValue(success);
      SpreadsheetApp.flush();
      continue;
    }
  }
}

【讨论】:

    【解决方案2】:

    我看到一个错字

    var currentFile = DriveApp.getFileById(currentFileId);
    var newFile = DriveApp.getFileByID(newFileId);
    

    getFileByID id 全部大写,根据 API 文档,我猜应该是 getFileById。另外,尝试打印currentFileIdnewFileId

    【讨论】:

    • Good catch...修正了大写,但仍然有错误。添加console.log(currentFileId)console.log(newFileId)currentFileIdnewFileId 似乎是正确的。控制台记录与 URL 匹配的 44 个字符的字母数字字符串。错误保持不变。还有其他想法吗?
    猜你喜欢
    • 1970-01-01
    • 2015-07-10
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多