同步 Excel 和 GoogleSheet

Sync Excel and GoogleSheet

提问人:Adri 提问时间:11/10/2023 最后编辑:Yuri KhristichAdri 更新时间:11/14/2023 访问量:115

问:

我有一个脚本可以将 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.");
  }
}
Excel Google-Apps-Script Google-Sheets 同步

评论

0赞 Tanaike 11/10/2023
我认为在您的问题中,当您提供当前的脚本时,这将有助于思考您当前的问题和您的问题。but when I run it and the sheetname(s) already exist, then I get an error. How can I fix this
0赞 Yuri Khristich 11/10/2023
我相信您可以(使用脚本)检查同名工作表是否已经存在并删除(或重命名)它。但实际的解决方案取决于脚本的外观。
0赞 Adri 11/10/2023
同时,我找到了一个脚本,可以在导入之前删除表。尝试再次上传代码,但仍然不行。
0赞 Yuri Khristich 11/10/2023
尝试上传代码是什么意思?您必须使用任何文本编辑器打开代码,复制文本并将其粘贴到您的问题中,在三引号 ''', '''
0赞 Cooper 11/10/2023
请分享一个最小的可重复示例。如果您提供产生问题的最小可重现示例,我们会更有帮助。试图让我们猜测这个问题是浪费每个人的时间。

答:

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)每周更新一次,涉及我们自行车小组的统计数据(谁参加了,公里数,惠特......