【问题标题】:Copy an entire Spreadsheet, Just Preserve the Values复制整个电子表格,只保留值
【发布时间】:2020-03-14 08:19:07
【问题描述】:

我想将包含 20 多张工作表的整个电子表格复制到云端硬盘中的其他位置;但是,我只想保留每个单元格中的硬值和格式,而不是公式(基本上只是对值进行快照)。我一直在研究如何写这个,但我对什么是最好的方法没有一个可靠的想法。我刚刚开始在我的谷歌表格培训中学习循环等条件,任何帮助将不胜感激。谢谢!

那些绿色的单元格都是 vlookup,它们从我在另一个电子表格上的数组中更新。想法是在数组中获取所有正确的数据,让这张表完全填写当天的正确值,然后最好将其保存为谷歌表,但只保存值,以便在事后可以编辑它们是数组数据中的错误。

【问题讨论】:

  • 您能提供样本电子表格吗?例如,在您的电子表格中,使用了需要授权的公式?因为,脚本需要被电子表格中使用的公式更改。另外,如果您有脚本,请提供。当然,请删除您的个人信息。
  • 使用谷歌应用脚​​本复制所有内容似乎是一种浪费,但如果您需要出于存档目的,只需在我的答案中导出为 pdf。
  • 好吧,有问题的电子表格中有许多 vlookup 和其他外部参考单元格,并且它每天都会更新,所以我想要一种方法来保存当前所有值的传真电子表格,以便在“复制”每张工作表后进行编辑。
  • 感谢您的回复和补充信息。我能问一下你的目标吗?您想将源 Google 电子表格复制为 Google 电子表格吗?或者您想将其复制为其他格式?
  • 基本上,我只是想把这张电子表格每张纸上的所有原始数据都复印一下,因为没有更好的词,只是存档在驱动器的其他地方,上面印有日期作为名称。我不希望各个单元格的功能在必须进行编辑的情况下保留,我宁愿他们只是从复制的单元格结束值中添加或减去。

标签: google-apps-script google-sheets google-sheets-api google-sheets-vlookup


【解决方案1】:
  • 您希望将源电子表格复制到您的 Google 云端硬盘的特定文件夹中。
  • 您想使用a date stamped on it for a name 作为文件名。
  • 您不想复制公式。您只想复制显示值。
  • 在您的电子表格中,包含many vlookups and other outside reference cells 的公式。
  • 您希望使用 Google Apps 脚本实现此目的。

如果我的理解是正确的,那么这个答案呢?请认为这只是几个可能的答案之一。

上述目标的示例脚本流程如下。

流程:

  1. 将源电子表格中的所有工作表复制为临时工作表。
  2. 在复制的工作表中,单元格仅被值覆盖。这样就可以删除公式了。
  3. 复制源电子表格。
  4. 删除源电子表格中的临时工作表。
  5. 删除目标电子表格中的原始工作表。
  6. 将复制的电子表格移动到特定文件夹。

示例脚本:

在运行脚本之前,请设置源电子表格 ID 和目标文件夹 ID。

function myFunction() {
  var spreadsheetId = "###"; // Please set the source Spreadsheet ID.
  var destFolderId = "###";  // Please set the destination folder ID.

  // Copy each sheet in the source Spreadsheet by removing the formulas as the temporal sheets.
  var ss = SpreadsheetApp.openById(spreadsheetId);
  var tempSheets = ss.getSheets().map(function(sheet) {
    var dstSheet = sheet.copyTo(ss).setName(sheet.getSheetName() + "_temp");
    var src = dstSheet.getDataRange();
    src.copyTo(src, {contentsOnly: true});
    return dstSheet;
  });
  
  // Copy the source Spreadsheet.
  var destination = ss.copy(ss.getName() + " - " + new Date().toLocaleString());
  
  // Delete the temporal sheets in the source Spreadsheet.
  tempSheets.forEach(function(sheet) {ss.deleteSheet(sheet)});
  
  // Delete the original sheets from the copied Spreadsheet and rename the copied sheets.
  destination.getSheets().forEach(function(sheet) {
    var sheetName = sheet.getSheetName();
    if (sheetName.indexOf("_temp") == -1) {
      destination.deleteSheet(sheet);
    } else {
      sheet.setName(sheetName.slice(0, -5));
    }
  });

  // Move file to the destination folder.
  var file = DriveApp.getFileById(destination.getId());
  DriveApp.getFolderById(destFolderId).addFile(file);
  file.getParents().next().removeFile(file);
}

注意:

  • 在此示例脚本中,使用了the script of this answer
  • 这是一个简单的示例脚本。所以请根据您的实际情况进行修改。

参考资料:

【讨论】:

  • 这正是我想要的 Tanaike,非常感谢!节省了我很多时间。请让我给你小费:)
  • @Warren Meroney 感谢您的回复和测试。我很高兴你的问题得到了解决。也谢谢你。
  • @Tanaike 很好的答案,你能解释一下 'ss.getSheets().map(function(sheet, i)' 中的 'i' 是什么意思吗?我认为 getSheets 只返回一个单维数组?
  • @CodeCamper 感谢您的回复。 i of ss.getSheets().map(function(sheet, i) 是数组的索引ss.getSheets()。在这种情况下,一维数组由return dstSheet; 返回。顺便说一句,我使用i 进行调试。我忘了删除这个。所以我现在删除了。
  • @Tanaike 我会这样做的 Tanaike! :)
【解决方案2】:

如果您真的打算使用这些数据,您可能需要三思而后行,只是随机复制所有内容。如果您只想存档只需将export?format=zip 添加到链接末尾,您将获得包含值和格式的保存副本。

【讨论】:

  • 谢谢 Camp 的建议,这是我原本想走的路线,但我的老板坚持要在床单上 >
  • @WarrenMeroney 好吧,如果您希望将其存档以用于记录保存,则将其保存为工作表是一个糟糕的主意,因为您很容易意外地编辑您的记录或备份。如果您想以某种方式提取数据以供以后使用,那么使用工作表是有意义的。
  • 是的,没错,从长远来看,他的意图是把它指向另一张纸:)
【解决方案3】:

另一种非常简单的方法是将工作表下载到 Excel。它将保留本地公式但删除外部引用(如 importrange 等),因此数据将保持冻结;) 您甚至可以从 Gsheets 打开 Excel 文件(无需将其转换为工作表)。

【讨论】:

  • 您好像忘记在此处添加链接了。
猜你喜欢
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多