为了账号安全,请及时绑定邮箱和手机立即绑定

谷歌表格撤消/重做功能

谷歌表格撤消/重做功能

温温酱 2022-01-13 17:33:23
我正在查看网络选项卡以查看是否将重做/撤消数据发送到 Google 表格中的服务器,但似乎不是——它似乎是本地用户/正在修改信息的设备的本地设备。实现撤消/重做功能的数据结构可能是什么样的?我的猜测是它将是一个堆栈(即数组),最后一个可撤消的操作被推送到堆栈,如下所示:actions = [     action_1,     action_2     ]但是对于这些动作中的每一个,实际的数据结构会是什么样子呢?我想对于单元格的基本修改,可以存储文本,但是在 Google 表格中有很多可能的事情要做,所以看起来“动作”可能几乎是无限复杂的。
查看完整描述

1 回答

?
LEATH

TA贡献1936条经验 获得超7个赞

  • 您想实现 Google 电子表格的撤消和重做功能。

  • 您可以使用 Google Apps 脚本。

我可以像上面那样理解。为此,这个示例脚本怎么样?因此,请将此视为几个可能的答案之一。

用法:

请执行以下流程以使用示例脚本。

  1. 创建新的电子表格并打开脚本编辑器。

    • 如果第一个选项卡不是 的名称Sheet1,请将其更改为Sheet1。在此示例脚本中,作为测试情况,undo 和 redo 函数用于运行到Sheet1活动电子表格中的工作表。请注意这一点。

  2. 将以下示例脚本复制并粘贴到脚本编辑器中,然后保存脚本。

  3. 将可安装的 OnEdit 事件触发器安装到函数installedOnEdit中。

    • 您可以在此处查看执行此操作的文档。请设置installedOnEdit为 OnEdit 事件触发器。

    • 当您安装可安装的 OnEdit 事件触发器时,将打开授权屏幕。所以请授权范围。

  4. 请关闭电子表格并重新打开电子表格。由此,onOpen()由简单的触发器运行。offset并被清除。然后,请打开脚本编辑器。

  5. 在电子表格中,手动将“foo”放入单元格“A1”。

    • 通过这个,电子表格logSpreadsheet被创建到根文件夹。这用作日志。

    • 所以只有这一次,请等待创建电子表格。

  6. 在根文件夹确认创建的电子表格后,手动将“bar”放入单元格“A1”。

  7. 手动将“baz”放入单元格“A1”。

    • 这时,当你看到日志Spreadsheet时,你可以看到单元格“A1:A3”中的值如下。这用于撤消和重做功能。

      {"range":"A1","value":"foo","oldValue":""}
      {"range":"A1","value":"bar","oldValue":"foo"}
      {"range":"A1","value":"baz","oldValue":"bar"}
  8. undo在脚本编辑器中运行该函数。

    • 这样,单元格“A1”的值从baz变为bar

  9. undo在脚本编辑器中 运行该函数。

    • 这样,单元格“A1”的值从bar变为foo

  10. undo在脚本编辑器中 运行该函数。

    • 这样,单元格“A1”的值从foo变为空。因为最初的情况是空的。

  11. redo在脚本编辑器中 运行该函数。

    • 这样,单元格“A1”的值从foo变为bar

  12. redo在脚本编辑器中 运行该函数。

    • 这样,单元格“A1”的值从bar变为baz

  13. 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)]);

}

笔记:

这是一个简单的示例脚本。不幸的是,复杂的动作可能无法使用。例如,在当前脚本中不能使用编辑多个单元格。我对此深表歉意。当您想添加更复杂的动作时,需要针对每种情况修改脚本。请注意这一点。

在当前阶段,当通过单击删除按钮删除单元格值时,旧值不包含在事件对象中。所以当你想测试值的删除时,请点击单元格并通过退格按钮删除单元格中的每个字符。这样,旧值将包含在事件对象中。请注意这一点。

我认为,如果您想做更复杂的操作,用修订数据覆盖电子表格可能是合适的。参考


查看完整回答
反对 回复 2022-01-13
  • 1 回答
  • 0 关注
  • 371 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号