1 回答

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
您想實(shí)現(xiàn) Google 電子表格的撤消和重做功能。
您可以使用 Google Apps 腳本。
我可以像上面那樣理解。為此,這個(gè)示例腳本怎么樣?因此,請(qǐng)將此視為幾個(gè)可能的答案之一。
用法:
請(qǐng)執(zhí)行以下流程以使用示例腳本。
創(chuàng)建新的電子表格并打開腳本編輯器。
如果第一個(gè)選項(xiàng)卡不是 的名稱
Sheet1
,請(qǐng)將其更改為Sheet1
。在此示例腳本中,作為測試情況,undo 和 redo 函數(shù)用于運(yùn)行到Sheet1
活動(dòng)電子表格中的工作表。請(qǐng)注意這一點(diǎn)。將以下示例腳本復(fù)制并粘貼到腳本編輯器中,然后保存腳本。
將可安裝的 OnEdit 事件觸發(fā)器安裝到函數(shù)
installedOnEdit
中。您可以在此處查看執(zhí)行此操作的文檔。請(qǐng)?jiān)O(shè)置
installedOnEdit
為 OnEdit 事件觸發(fā)器。當(dāng)您安裝可安裝的 OnEdit 事件觸發(fā)器時(shí),將打開授權(quán)屏幕。所以請(qǐng)授權(quán)范圍。
請(qǐng)關(guān)閉電子表格并重新打開電子表格。由此,
onOpen()
由簡單的觸發(fā)器運(yùn)行。offset
并被清除。然后,請(qǐng)打開腳本編輯器。在電子表格中,手動(dòng)將“foo”放入單元格“A1”。
通過這個(gè),電子表格
logSpreadsheet
被創(chuàng)建到根文件夾。這用作日志。所以只有這一次,請(qǐng)等待創(chuàng)建電子表格。
在根文件夾確認(rèn)創(chuàng)建的電子表格后,手動(dòng)將“bar”放入單元格“A1”。
手動(dòng)將“baz”放入單元格“A1”。
這時(shí),當(dāng)你看到日志Spreadsheet時(shí),你可以看到單元格“A1:A3”中的值如下。這用于撤消和重做功能。
{"range":"A1","value":"foo","oldValue":""} {"range":"A1","value":"bar","oldValue":"foo"} {"range":"A1","value":"baz","oldValue":"bar"}
undo
在腳本編輯器中運(yùn)行該函數(shù)。這樣,單元格“A1”的值從
baz
變?yōu)?code>bar。undo
在腳本編輯器中 運(yùn)行該函數(shù)。這樣,單元格“A1”的值從
bar
變?yōu)?code>foo。undo
在腳本編輯器中 運(yùn)行該函數(shù)。這樣,單元格“A1”的值從
foo
變?yōu)榭?。因?yàn)樽畛醯那闆r是空的。redo
在腳本編輯器中 運(yùn)行該函數(shù)。這樣,單元格“A1”的值從
foo
變?yōu)?code>bar。redo
在腳本編輯器中 運(yùn)行該函數(shù)。這樣,單元格“A1”的值從
bar
變?yōu)?code>baz。redo
在腳本編輯器中 運(yùn)行該函數(shù)。這樣,單元格“A1”的值不會(huì)改變。因?yàn)檫@種情況是最新的。
示例腳本:
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)]);
}
筆記:
這是一個(gè)簡單的示例腳本。不幸的是,復(fù)雜的動(dòng)作可能無法使用。例如,在當(dāng)前腳本中不能使用編輯多個(gè)單元格。我對(duì)此深表歉意。當(dāng)您想添加更復(fù)雜的動(dòng)作時(shí),需要針對(duì)每種情況修改腳本。請(qǐng)注意這一點(diǎn)。
在當(dāng)前階段,當(dāng)通過單擊刪除按鈕刪除單元格值時(shí),舊值不包含在事件對(duì)象中。所以當(dāng)你想測試值的刪除時(shí),請(qǐng)點(diǎn)擊單元格并通過退格按鈕刪除單元格中的每個(gè)字符。這樣,舊值將包含在事件對(duì)象中。請(qǐng)注意這一點(diǎn)。
我認(rèn)為,如果您想做更復(fù)雜的操作,用修訂數(shù)據(jù)覆蓋電子表格可能是合適的。參考
添加回答
舉報(bào)