Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 谷歌表单撤销/重做功能_Javascript_Google Apps Script_Google Sheets_Stack - Fatal编程技术网

Javascript 谷歌表单撤销/重做功能

Javascript 谷歌表单撤销/重做功能,javascript,google-apps-script,google-sheets,stack,Javascript,Google Apps Script,Google Sheets,Stack,我在查看网络选项卡,查看是否在Google Sheets中向服务器发送了重做/撤消数据,但似乎不是--似乎是修改信息的本地用户/设备的本地数据 实现撤消/重做功能的数据结构可能是什么样的?我的猜测是,它将是一个堆栈(即数组),最后一个可撤消的操作被推送到堆栈中,如下所示: actions = [ action_1, action_2 ] 但是,每一个操作的实际数据结构是什么样的呢?我想,对于一个单元格的基本修改,文本可以存储,但在谷歌表单中有很多可能的事情要做,所以“操作”似乎

我在查看网络选项卡,查看是否在Google Sheets中向服务器发送了重做/撤消数据,但似乎不是--似乎是修改信息的本地用户/设备的本地数据

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

actions = [
    action_1,
    action_2
]
但是,每一个操作的实际数据结构是什么样的呢?我想,对于一个单元格的基本修改,文本可以存储,但在谷歌表单中有很多可能的事情要做,所以“操作”似乎几乎是无限复杂的。

  • 您想要实现谷歌电子表格的撤销和重做功能
  • 你可以使用谷歌应用程序脚本
我可以像上面那样理解。对于这个,这个示例脚本怎么样?所以请把这看作是几个可能的答案之一

用法: 请按照以下流程使用示例脚本

  • 创建新的电子表格并打开脚本编辑器。
    • 如果第一个选项卡不是
      Sheet1
      的名称,请将其更改为
      Sheet1
      。在本示例脚本中,作为测试情况,“撤消”和“重做”功能用于运行到活动电子表格中的
      Sheet1
      工作表。请小心这个
  • 将以下示例脚本复制并粘贴到脚本编辑器中,然后保存脚本
  • 将可安装的OneEdit事件触发器安装到函数
    installedEndit
    • 您可以在上查看执行此操作的文档。请将
      installedEndit
      设置为OneEdit事件触发器
    • 安装可安装的OnEdit事件触发器时,将打开授权屏幕。所以请授权范围
  • 请关闭电子表格,然后重新打开电子表格。这样,
    onOpen()
    由简单触发器运行。并且
    偏移量
    被清除。然后,请打开脚本编辑器
  • 在电子表格中,手动将“foo”放入单元格“A1”。
    • 这样,将
      logSpreadsheet
      的电子表格创建到根文件夹中。这被用作日志
    • 所以只有这一次,请等待创建电子表格
  • 在根文件夹中确认创建的电子表格后,手动将“bar”放在单元格“A1”中
  • 手动将“baz”放入单元格“A1”

    • 此时,当您看到日志电子表格时,您可以看到单元格“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)]);
    }