1 回答

TA贡献1936条经验 获得超7个赞
您想实现 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 function
function 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 function
function 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)]);
}
笔记:
这是一个简单的示例脚本。不幸的是,复杂的动作可能无法使用。例如,在当前脚本中不能使用编辑多个单元格。我对此深表歉意。当您想添加更复杂的动作时,需要针对每种情况修改脚本。请注意这一点。
在当前阶段,当通过单击删除按钮删除单元格值时,旧值不包含在事件对象中。所以当你想测试值的删除时,请点击单元格并通过退格按钮删除单元格中的每个字符。这样,旧值将包含在事件对象中。请注意这一点。
我认为,如果您想做更复杂的操作,用修订数据覆盖电子表格可能是合适的。参考
添加回答
举报