将GDrive中XLSX文件数据同步至Google Sheet的方案求助
Google Drive中XLSX文件同步到Google Sheet的报错解决思路
问题背景
我在Google Drive中有一个XLSX格式的文件,每月会通过添加新版本进行更新。另有一个Google Sheet文件,需要基于该XLSX文件的数据制作图表。
最初尝试使用Google Sheet的IMPORTRANGE函数,但该函数不支持XLSX格式。随后编写了带调度功能的Google Apps Script脚本进行同步,代码如下:
function synchronizujDaneZExcela() { // 设置 var kluczPlikuExcela = "_____MY_KEY_____"; // 设置 var nazwaArkuszaExcela = "Podsumowanie"; // Excel文件中的工作表名称 var nazwaArkuszaGoogle = "Podsumowanie kopia"; // Google Sheets中的工作表名称 // 获取Excel文件 var plik = DriveApp.getFileById(kluczPlikuExcela); // 如果找到Excel文件 if (plik) { // 获取Excel文件中"Podsumowanie"工作表的数据 var excelData = SpreadsheetApp.open(plik).getSheetByName(nazwaArkuszaExcela).getDataRange().getValues(); // 打开Google Sheets文件 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // 检查是否存在"Podsumowanie kopia"工作表,不存在则新建 var arkusz = spreadsheet.getSheetByName(nazwaArkuszaGoogle); if (!arkusz) { arkusz = spreadsheet.insertSheet(); arkusz.setName(nazwaArkuszaGoogle); } // 将数据写入Google Sheets arkusz.clear(); // 清空"Podsumowanie kopia"工作表 arkusz.getRange(1, 1, excelData.length, excelData[0].length).setValues(excelData); Logger.log("同步成功完成。"); } else { Logger.log("未找到Excel文件。"); } }
运行脚本时出现错误:Exception: Service Spreadsheets failed while accessing document with id ....
解决思路与替代方案
1. 修复现有脚本:转换XLSX为Google Sheet后读取
SpreadsheetApp.open()仅支持原生Google Sheet文件,无法直接读取XLSX格式。需要先将XLSX转换为临时Google Sheet,读取数据后再清理临时文件。
修改后的脚本如下(需启用Drive API):
function synchronizujDaneZExcela() { var kluczPlikuExcela = "_____MY_KEY_____"; var nazwaArkuszaExcela = "Podsumowanie"; var nazwaArkuszaGoogle = "Podsumowanie kopia"; var plik = DriveApp.getFileById(kluczPlikuExcela); if (!plik) { Logger.log("未找到Excel文件。"); return; } // 将XLSX转换为临时Google Sheet var tempSheet = Drive.Files.copy( {title: "Temp_Excel_Conversion", mimeType: MimeType.GOOGLE_SHEETS}, kluczPlikuExcela ); try { // 读取转换后的Google Sheet数据 var excelData = SpreadsheetApp.openById(tempSheet.id).getSheetByName(nazwaArkuszaExcela).getDataRange().getValues(); var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var arkusz = spreadsheet.getSheetByName(nazwaArkuszaGoogle); if (!arkusz) { arkusz = spreadsheet.insertSheet(); arkusz.setName(nazwaArkuszaGoogle); } arkusz.clear(); arkusz.getRange(1, 1, excelData.length, excelData[0].length).setValues(excelData); Logger.log("同步成功完成。"); } catch (e) { Logger.log("同步出错:" + e.message); } finally { // 删除临时转换的Google Sheet DriveApp.getFileById(tempSheet.id).setTrashed(true); } }
启用Drive API步骤:
- 在脚本编辑器中点击「扩展」→「Apps Script」→「服务」→「添加服务」,找到「Drive API」并启用;
- 或在Google Cloud Console中为当前脚本项目启用Drive API权限。
2. 替代方案:自动转换+IMPORTRANGE
利用Google Drive的自动转换功能,将XLSX自动转为Google Sheet,再用IMPORTRANGE同步数据:
- 打开Google Drive,点击右上角设置图标→「设置」→「上传设置」,勾选「上传时将上传的文件转换为Google Docs编辑器格式」,保存设置;
- 后续上传XLSX新版本时,系统会自动生成对应的Google Sheet文件;
- 在目标Google Sheet中使用公式:
=IMPORTRANGE("转换后的Google Sheet ID", "Podsumowanie!A:Z"),首次使用需授权访问权限。
若需要保留原XLSX文件,可手动替换版本:右键点击转换后的Google Sheet→「管理版本」→「上传新版本」,选择最新的XLSX文件,转换后的Sheet会自动更新数据,IMPORTRANGE也会同步刷新。
3. 轻量脚本方案:直接导入XLSX数据
如果XLSX表格结构简单,可直接解析文件内容导入目标Sheet,无需转换格式:
function importXLSXToSheet() { var xlsxFileId = "_____MY_KEY_____"; var targetSheetName = "Podsumowanie kopia"; var xlsxFile = DriveApp.getFileById(xlsxFileId); var targetSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var targetSheet = targetSpreadsheet.getSheetByName(targetSheetName); if (!targetSheet) { targetSheet = targetSpreadsheet.insertSheet(targetSheetName); } // 清空目标工作表 targetSheet.clear(); // 解析XLSX并导入数据(适配简单表格) var blob = xlsxFile.getBlob(); var data = Utilities.parseCsv(blob.getDataAsString(), "\t"); targetSheet.getRange(1, 1, data.length, data[0].length).setValues(data); Logger.log("数据导入完成。"); }
注:此方法对合并单元格、复杂公式等格式兼容性较差,仅适用于基础结构的表格。
内容的提问来源于stack exchange,提问作者CezarySzulc
相关产品推荐
相关产品推荐

