LEATH
您想实现 Google 电子表格的撤消和重做功能。您可以使用 Google Apps 脚本。我可以像上面那样理解。为此,这个示例脚本怎么样?因此,请将此视为几个可能的答案之一。用法:请执行以下流程以使用示例脚本。创建新的电子表格并打开脚本编辑器。如果第一个选项卡不是 的名称Sheet1,请将其更改为Sheet1。在此示例脚本中,作为测试情况,undo 和 redo 函数用于运行到Sheet1活动电子表格中的工作表。请注意这一点。将以下示例脚本复制并粘贴到脚本编辑器中,然后保存脚本。将可安装的 OnEdit 事件触发器安装到函数installedOnEdit中。您可以在此处查看执行此操作的文档。请设置installedOnEdit为 OnEdit 事件触发器。当您安装可安装的 OnEdit 事件触发器时,将打开授权屏幕。所以请授权范围。请关闭电子表格并重新打开电子表格。由此,onOpen()由简单的触发器运行。offset并被清除。然后,请打开脚本编辑器。在电子表格中,手动将“foo”放入单元格“A1”。通过这个,电子表格logSpreadsheet被创建到根文件夹。这用作日志。所以只有这一次,请等待创建电子表格。在根文件夹确认创建的电子表格后,手动将“bar”放入单元格“A1”。手动将“baz”放入单元格“A1”。这时,当你看到日志Spreadsheet时,你可以看到单元格“A1:A3”中的值如下。这用于撤消和重做功能。{"range":"A1","value":"foo","oldValue":""}
{"range":"A1","value":"bar","oldValue":"foo"}
{"range":"A1","value":"baz","oldValue":"bar"}undo在脚本编辑器中运行该函数。这样,单元格“A1”的值从baz变为bar。undo在脚本编辑器中 运行该函数。这样,单元格“A1”的值从bar变为foo。undo在脚本编辑器中 运行该函数。这样,单元格“A1”的值从foo变为空。因为最初的情况是空的。redo在脚本编辑器中 运行该函数。这样,单元格“A1”的值从foo变为bar。redo在脚本编辑器中 运行该函数。这样,单元格“A1”的值从bar变为baz。redo在脚本编辑器中 运行该函数。这样,单元格“A1”的值不会改变。因为这种情况是最新的。示例脚本:var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");var prop = PropertiesService.getScriptProperties();function onOpen() { prop.setProperty("offset", "0");}function getSheet() { var logId = prop.getProperty("logSpreadsheetId"); if (logId) { return SpreadsheetApp.openById(logId).getSheets()[0]; } throw new Error("Please edit a cell in the Spreadsheet. By this, the Spreadsheet for logging is created.");}// Undo functionfunction undo() { var logsheet = getSheet(); var offset = Number(prop.getProperty("offset")); var lastRow = logsheet.getLastRow(); if (lastRow + offset > 0) { var log = logsheet.getRange(lastRow, 1).offset(offset, 0).getValue(); var obj = JSON.parse(log); sheet.getRange(obj.range).setValue(obj.oldValue); prop.setProperty("offset", offset - 1); }}// Redo functionfunction redo() { var logsheet = getSheet(); var offset = Number(prop.getProperty("offset")) + 1; var lastRow = logsheet.getLastRow(); if (lastRow + offset <= lastRow) { var log = logsheet.getRange(lastRow, 1).offset(offset, 0).getValue(); var obj = JSON.parse(log); sheet.getRange(obj.range).setValue(obj.value); prop.setProperty("offset", offset); }}// Please set the installable OnEdit event trigger to this function.function installedOnEdit(e) { var logId = prop.getProperty("logSpreadsheetId") var ss; if (logId) { ss = SpreadsheetApp.openById(logId); } else { ss = SpreadsheetApp.create("logSpreadsheet"); prop.setProperty("logSpreadsheetId", ss.getId()); } var log = {range: e.range.getA1Notation(), value: "value" in e ? e.value : "", oldValue: "oldValue" in e ? e.oldValue : ""}; ss.getSheets()[0].appendRow([JSON.stringify(log)]);}笔记:这是一个简单的示例脚本。不幸的是,复杂的动作可能无法使用。例如,在当前脚本中不能使用编辑多个单元格。我对此深表歉意。当您想添加更复杂的动作时,需要针对每种情况修改脚本。请注意这一点。在当前阶段,当通过单击删除按钮删除单元格值时,旧值不包含在事件对象中。所以当你想测试值的删除时,请点击单元格并通过退格按钮删除单元格中的每个字符。这样,旧值将包含在事件对象中。请注意这一点。我认为,如果您想做更复杂的操作,用修订数据覆盖电子表格可能是合适的。参考