猿问

谷歌表格撤消/重做功能

我正在查看网络选项卡以查看是否将重做/撤消数据发送到 Google 表格中的服务器,但似乎不是——它似乎是本地用户/正在修改信息的设备的本地设备。

实现撤消/重做功能的数据结构可能是什么样的?我的猜测是它将是一个堆栈(即数组),最后一个可撤消的操作被推送到堆栈,如下所示:

actions = [
    action_1,
    action_2
    ]

但是对于这些动作中的每一个,实际的数据结构会是什么样子呢?我想对于单元格的基本修改,可以存储文本,但是在 Google 表格中有很多可能的事情要做,所以看起来“动作”可能几乎是无限复杂的。


温温酱
浏览 372回答 1
1回答

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在脚本编辑器中&nbsp;运行该函数。这样,单元格“A1”的值从bar变为foo。undo在脚本编辑器中&nbsp;运行该函数。这样,单元格“A1”的值从foo变为空。因为最初的情况是空的。redo在脚本编辑器中&nbsp;运行该函数。这样,单元格“A1”的值从foo变为bar。redo在脚本编辑器中&nbsp;运行该函数。这样,单元格“A1”的值从bar变为baz。redo在脚本编辑器中&nbsp;运行该函数。这样,单元格“A1”的值不会改变。因为这种情况是最新的。示例脚本:var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");var prop = PropertiesService.getScriptProperties();function onOpen() {&nbsp; prop.setProperty("offset", "0");}function getSheet() {&nbsp; var logId = prop.getProperty("logSpreadsheetId");&nbsp; if (logId) {&nbsp; &nbsp; return SpreadsheetApp.openById(logId).getSheets()[0];&nbsp; }&nbsp; throw new Error("Please edit a cell in the Spreadsheet. By this, the Spreadsheet for logging is created.");}// Undo functionfunction undo() {&nbsp; var logsheet = getSheet();&nbsp; var offset = Number(prop.getProperty("offset"));&nbsp; var lastRow = logsheet.getLastRow();&nbsp; if (lastRow + offset > 0) {&nbsp; &nbsp; var log = logsheet.getRange(lastRow, 1).offset(offset, 0).getValue();&nbsp; &nbsp; var obj = JSON.parse(log);&nbsp; &nbsp; sheet.getRange(obj.range).setValue(obj.oldValue);&nbsp; &nbsp; prop.setProperty("offset", offset - 1);&nbsp; }}// Redo functionfunction redo() {&nbsp; var logsheet = getSheet();&nbsp; var offset = Number(prop.getProperty("offset")) + 1;&nbsp; var lastRow = logsheet.getLastRow();&nbsp; if (lastRow + offset <= lastRow) {&nbsp; &nbsp; var log = logsheet.getRange(lastRow, 1).offset(offset, 0).getValue();&nbsp; &nbsp; var obj = JSON.parse(log);&nbsp; &nbsp; sheet.getRange(obj.range).setValue(obj.value);&nbsp; &nbsp; prop.setProperty("offset", offset);&nbsp; }}// Please set the installable OnEdit event trigger to this function.function installedOnEdit(e) {&nbsp; var logId = prop.getProperty("logSpreadsheetId")&nbsp; var ss;&nbsp; if (logId) {&nbsp; &nbsp; ss = SpreadsheetApp.openById(logId);&nbsp; } else {&nbsp; &nbsp; ss = SpreadsheetApp.create("logSpreadsheet");&nbsp; &nbsp; prop.setProperty("logSpreadsheetId", ss.getId());&nbsp; }&nbsp; var log = {range: e.range.getA1Notation(), value: "value" in e ? e.value : "", oldValue: "oldValue" in e ? e.oldValue : ""};&nbsp; ss.getSheets()[0].appendRow([JSON.stringify(log)]);}笔记:这是一个简单的示例脚本。不幸的是,复杂的动作可能无法使用。例如,在当前脚本中不能使用编辑多个单元格。我对此深表歉意。当您想添加更复杂的动作时,需要针对每种情况修改脚本。请注意这一点。在当前阶段,当通过单击删除按钮删除单元格值时,旧值不包含在事件对象中。所以当你想测试值的删除时,请点击单元格并通过退格按钮删除单元格中的每个字符。这样,旧值将包含在事件对象中。请注意这一点。我认为,如果您想做更复杂的操作,用修订数据覆盖电子表格可能是合适的。参考
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答