如何在Google Sheets单元格中写入文件处理进度
解决Google Apps Script进度写入“PROGRESS”列问题
修改后的代码
function onOpen() { SpreadsheetApp.getUi() .createMenu('Custom Menu') .addItem('开始处理文件', 'showAlert') .addToUi(); } function showAlert() { var ui = SpreadsheetApp.getUi(); var result = ui.alert( '确认操作', '确定要开始下载并重命名文件吗?', ui.ButtonSet.YES_NO); if (result == ui.Button.YES){ let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); let lastRow = sheet.getLastRow(); // 找到"PROGRESS"列的索引 let headerRow = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; let progressCol = headerRow.indexOf("PROGRESS") + 1; // 列索引从1开始 if (progressCol === 0) { ui.alert('未找到"PROGRESS"列,请检查表格表头'); return; } // 提前获取目标文件夹,避免循环内重复调用API let folder = DriveApp.getFolderById("你的文件夹ID"); for (let i = 0; i < lastRow - 1; i++) { try { let rowNum = 2 + i; let url = sheet.getRange(rowNum, 1).getValue(); let name = sheet.getRange(rowNum, 2).getValue(); // 下载文件并重命名保存 let blob = UrlFetchApp.fetch(url).getBlob(); folder.createFile(blob).setName(name); // 写入当前行进度 sheet.getRange(rowNum, progressCol).setValue("COMPLETED"); // 立即刷新表格显示进度 SpreadsheetApp.flush(); } catch (e) { // 捕获错误,标记为失败 sheet.getRange(2 + i, progressCol).setValue("FAILED: " + e.message); SpreadsheetApp.flush(); ui.alert("第" + (i+1) + "行处理失败:" + e.message); } } // 全部完成后,将所有进度单元格设置为"completed" sheet.getRange(2, progressCol, lastRow - 1).setValue("completed"); SpreadsheetApp.flush(); ui.alert("所有文件处理完成"); } else { ui.alert('操作已取消'); } }
关键修改说明
- 定位PROGRESS列:通过表头查找列索引,避免硬编码列号,适配表格结构变化
- 优化API调用:将文件夹获取移到循环外,减少Drive API调用次数,提升效率
- 实时写入进度:每完成一个文件操作后,立即写入对应行的
COMPLETED,并调用SpreadsheetApp.flush()确保表格实时更新 - 错误处理:增加try-catch捕获异常,标记失败行并提示错误信息
- 批量更新最终状态:全部处理完成后,批量将所有进度单元格设置为
completed - 移除冗余弹窗:删除循环内的弹窗,改为仅在开始、错误、结束时提示,避免流程中断
内容的提问来源于stack exchange,提问作者Zeeshan Hasnain
相关产品推荐
相关产品推荐

