Javascript 谷歌表单撤销/重做功能
我在查看网络选项卡,查看是否在Google Sheets中向服务器发送了重做/撤消数据,但似乎不是--似乎是修改信息的本地用户/设备的本地数据 实现撤消/重做功能的数据结构可能是什么样的?我的猜测是,它将是一个堆栈(即数组),最后一个可撤消的操作被推送到堆栈中,如下所示:Javascript 谷歌表单撤销/重做功能,javascript,google-apps-script,google-sheets,stack,Javascript,Google Apps Script,Google Sheets,Stack,我在查看网络选项卡,查看是否在Google Sheets中向服务器发送了重做/撤消数据,但似乎不是--似乎是修改信息的本地用户/设备的本地数据 实现撤消/重做功能的数据结构可能是什么样的?我的猜测是,它将是一个堆栈(即数组),最后一个可撤消的操作被推送到堆栈中,如下所示: actions = [ action_1, action_2 ] 但是,每一个操作的实际数据结构是什么样的呢?我想,对于一个单元格的基本修改,文本可以存储,但在谷歌表单中有很多可能的事情要做,所以“操作”似乎
actions = [
action_1,
action_2
]
但是,每一个操作的实际数据结构是什么样的呢?我想,对于一个单元格的基本修改,文本可以存储,但在谷歌表单中有很多可能的事情要做,所以“操作”似乎几乎是无限复杂的。- 您想要实现谷歌电子表格的撤销和重做功能
- 你可以使用谷歌应用程序脚本
- 如果第一个选项卡不是
的名称,请将其更改为Sheet1
。在本示例脚本中,作为测试情况,“撤消”和“重做”功能用于运行到活动电子表格中的Sheet1
工作表。请小心这个Sheet1
installedEndit
。
- 您可以在上查看执行此操作的文档。请将
设置为OneEdit事件触发器installedEndit
- 安装可安装的OnEdit事件触发器时,将打开授权屏幕。所以请授权范围
onOpen()
由简单触发器运行。并且偏移量被清除。然后,请打开脚本编辑器
- 这样,将
的电子表格创建到根文件夹中。这被用作日志logSpreadsheet
- 所以只有这一次,请等待创建电子表格
- 此时,当您看到日志电子表格时,您可以看到单元格“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();
函数onOpen(){
属性设置属性(“偏移量”、“0”);
}
函数getSheet(){
var logId=prop.getProperty(“logSpreadsheetId”);
如果(logId){
返回SpreadsheetApp.openById(logId.getSheets()[0];
}
抛出新错误(“请编辑电子表格中的一个单元格。这样,将创建用于记录的电子表格。”);
}
//撤消功能
函数undo(){
var logsheet=getSheet();
var offset=编号(属性getProperty(“offset”);
var lastRow=logsheet.getLastRow();
如果(最后一行+偏移量>0){
var log=logsheet.getRange(lastRow,1).offset(offset,0).getValue();
var obj=JSON.parse(log);
表.getRange(对象范围).setValue(对象旧值);
属性(“偏移量”,偏移量-1);
}
}
//重做功能
函数redo(){
var logsheet=getSheet();
var offset=Number(prop.getProperty(“offset”))+1;
var lastRow=logsheet.getLastRow();
如果(lastRow+offset虽然我不确定是否能正确理解您的目标,例如,如何使用OnEdit事件触发器和OnChange事件触发器为Google Apps脚本创建操作日志?使用事件触发器时,当用户编辑Google电子表格时,可以检索每个操作的日志。如何创建g使用此函数的撤消/重做功能?如果我误解了你的目标,我道歉。@Tanaike是的,那实际上太好了。你能展示一个记录上次撤消/重做操作的示例脚本吗?谢谢你的回复。在我准备示例脚本之前,我想确认一下。在这种情况下,使用的是谷歌应用程序脚本。这包括吗d在你期望的方向上?@Tanaike那很好——我更感兴趣的是查看将要记录的数据结构。可能只是显示一个基本日志,用于添加单元格值或在多个单元格上执行查找替换。我提出了一个示例脚本作为答案。你能确认一下吗?如果我误解了你的目标,而这不是指令如果你想要什么,我道歉。
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)]);
}