提问人:Adri 提问时间:11/10/2023 最后编辑:Yuri KhristichAdri 更新时间:11/14/2023 访问量:115
同步 Excel 和 GoogleSheet
Sync Excel and GoogleSheet
问:
我有一个脚本可以将 excel 文件与谷歌表格同步:
它工作正常,但是当我运行它并且工作表名称已经存在时,我收到错误。 如何解决此问题:在执行脚本之前覆盖或删除所有现有工作表? 我正在尝试发布代码,但总是出现错误。
// Importing all sheets from Excel to Google Sheets
function importAllExcelSheets() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var file = DriveApp.getFilesByName("Mijn Bestand.xlsm");
// Replace NAAM_VAN_HET_EXCEL_BESTAND.xlsx with the exact name of your Excel file.
if (file.hasNext()) {
var excelFile = file.next();
var blob = excelFile.getBlob();
var resource = {
title: "[Google Sheets] " + excelFile.getName(),
mimeType: MimeType.GOOGLE_SHEETS,
};
var newFile = Drive.Files.insert(resource, blob);
var newSpreadsheet = SpreadsheetApp.openById(newFile.id);
var sheets = newSpreadsheet.getSheets();
for (var i = 0; i < sheets.length; i++) {
var newSheet = sheets[i];
var data = newSheet.getDataRange().getValues();
var sheetName = newSheet.getName();
var targetSheet = sheet.copyTo(SpreadsheetApp.getActiveSpreadsheet());
targetSheet.setName(sheetName);
targetSheet.getRange(1, 1, data.length, data[0].length).setValues(data);
}
Browser.msgBox("Alle sheets uit het Excel-bestand zijn succesvol geïmporteerd.");
} else {
Browser.msgBox("Excel-bestand niet gevonden. Zorg ervoor dat het bestand bestaat en dat de naam correct is gespeld.");
}
}
答:
1赞
Yuri Khristich
11/13/2023
#1
尝试替换以下行:
targetSheet.setName(sheetName);
跟:
try { targetSheet.setName(sheetName) } catch(e) {}
如果电子表格已具有给定名称,则不会重命名工作表。
或者,您可以尝试获取具有相同名称的工作表并重命名它。像这样的东西:
try {
var temp_sheet = newSpreadsheet.getSheetByName(sheetName);
temp_sheet.setName(temp_sheet.getName() + "#");
} catch(e) {}
更新
在添加新工作表之前,您可以尝试删除带有名称的工作表:sheetName
try {
var sheet_to_remove = newSpreadsheet.getSheetByName(sheetName);
newSpreadsheet.deleteSheet(sheet_to_remove);
} catch(e) {}
注意:如果电子表格中只有一个工作表,它可能不会删除工作表。如果是你的情况,可能将这两种方法结合起来是有意义的:
- 首先尝试获取同名的工作表并重命名它
- 复制新工作表
- 尝试删除重命名的工作表
像这样的东西:
var sheet_to_delete = newSpreadsheet.getSheetByName(sheetName);
if (sheet_to_delete != null) sheet_to_delete.setName(sheetName + "#");
// here is the part of your code to copy the data from your .xls
if (sheet_to_delete != null) newSpreadsheet.deleteSheet(sheet_to_delete);
更新 2
尝试替换以下行:
for (var i = 0; i < sheets.length; i++) {
var newSheet = sheets[i];
var data = newSheet.getDataRange().getValues();
var sheetName = newSheet.getName();
var targetSheet = sheet.copyTo(SpreadsheetApp.getActiveSpreadsheet());
targetSheet.setName(sheetName);
targetSheet.getRange(1, 1, data.length, data[0].length).setValues(data);
}
跟:
var ss = SpreadsheetApp.getActiveSpreadsheet(); // the target spreadsheet
for (var i = 0; i < sheets.length; i++) {
// get the name of the copied sheet from the source spreadsheet
var sheetName = sheets[i].getName();
// copy the sheet from the source spreadsheet to the target one
// it copies the sheet a whole with its formatting, not just data from the cells
// the copy `targetSheet` gets some default name 'Copy of ...'
var targetSheet = sheets[i].copyTo(ss);
// on the target spreadsheet try to get the old sheet with the name `sheetName`
var old_sheet = ss.getSheetByName(sheetName);
// if there is the sheet, delete it
if (old_sheet != null) ss.deleteSheet(old_sheet);
// assign to the copied sheet the proper name instead of the default one
targetSheet.setName(sheetName);
}
如果你想删除临时(?)文件,在循环之后添加以下行是有意义的:[Google Sheets] Mijn Bestand.xlsm
Drive.Files.trash(newFile.getId());
它会自动将文件放入垃圾箱。
评论
0赞
Adri
11/13/2023
这两种解决方案都添加了所有带有现有工作表名称副本的工作表。我想替换它们,而不是复制它们。这就是为什么我尝试在添加新工作表之前先删除现有文件的选项。
0赞
Yuri Khristich
11/13/2023
不确定我是否完全了解您的工作流程。如果您打算尝试删除同名的旧工作表,请参阅我的答案的更新。
0赞
Adri
11/14/2023
我在 Excel 表格中的数据每天都会更新。因此,它更像是Googlesheet中数据的刷新。也因为我想保留 Google 表格中单元格的格式(或尽可能保持单元格的格式)。
0赞
Yuri Khristich
11/14/2023
不好意思。我仍然不知道你想做什么,出了什么问题。试着一步一步地描述:(1)你有什么,(2)你在做什么,(3)期望的结果应该是什么样子(也许用截图)。您可以在答案中添加此信息。
0赞
Adri
11/14/2023
我正在尝试将 excel 文件中的数据嵌入到网页中。但是当我从 excel 执行此操作时,每个人都可以看到 url 并下载整个文件。可能存在限制,但它仅适用于 Onedrive for business。使用 GoogleSheets,可以做到这一点。所以我正在寻找一种同步 excel 和 googlesheets 的方法。带有几张纸的 excel 文件(链接到 MS Access)每周更新一次,涉及我们自行车小组的统计数据(谁参加了,公里数,惠特......
评论
but when I run it and the sheetname(s) already exist, then I get an error. How can I fix this