[英]Google Docs Script: Move cell to two other sheets onEdit but no duplicates
[英]Google Sheets move cursor onEdit trigger based on cell content
我正在嘗試編寫Google表格應用程序腳本功能,該功能檢查當前活動單元格的內容,將其與另一個單元格的內容進行匹配,然后根據該檢查的結果移動光標。
對於此示例的電子表格: https : //docs.google.com/spreadsheets/d/1kpuVT1ZkK0iOSy_nGNPxvXPTFJrX-0JgNmEev6U--5c/edit#gid=0
我希望用戶轉到D2,輸入一個值后跟Tab,然后當活動單元格在E2時,該函數將檢查D2中D2中的值是否相同。 如果是,請留在E2。 然后我們在E2中輸入值,然后輸入Tab,函數檢查它是否與C2相同,如果是,則從F2向下移動並向左移動兩次到D3。 因此,如果正確輸入了所有值,則光標在D,E和F中的單元格之間曲折,如下所示:
我能找到的最接近的是下面的答案,但它涉及每次點擊菜單中的方法:
我想這個函數可以在編輯文檔開始時觸發,然后它繼續移動光標直到文檔完成,此時函數可以停止。
有任何想法嗎?
編輯:到目前為止我嘗試過:
我已設法將位置更改為硬編碼位置'D3'並創建一個功能,使用這些功能向下移動一個:
function onOpen() {
var m = SpreadsheetApp.getUi().createMenu('Move');
m.addItem('Move to D3', 'move').addToUi();
m.addItem('Move to one below', 'move2').addToUi();
m.addItem('Move down left', 'move_down_left').addToUi();
}
function move() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();
var range = s.getRange('D3');
s.setActiveRange(range);
}
function move2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();
var r = s.getActiveRange();
var c = r.getCell(1,1);
var target = s.getRange(c.getRow() + 1, c.getColumn());
s.setActiveRange(target);
}
function move_down_left() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();
var r = s.getActiveRange();
var c0 = r.getCell(1,1);
var r1 = s.getRange(c0.getRow(), c0.getColumn() - 1);
var c1 = r1.getCell(1,1);
var r2 = s.getRange(c1.getRow(), c1.getColumn() - 2);
var c2 = r2.getCell(1,1);
if (c1.getValue() == c2.getValue()) {
var target = s.getRange(c1.getRow() + 1, c1.getColumn() - 1);
s.setActiveRange(target);
}
}
正如我在評論中提到的,您希望使用一個簡單的觸發器函數(這樣它就適用於所有用戶,而不需要他們首先授權腳本)。 簡單觸發器自然存在一些局限性 ,但對於您描述的工作流程,它們並不適用。
接收on edit
觸發器調用的函數的一個關鍵原則是它有一個事件對象,其中包含有關已編輯的單元格的數據:
- authMode :
ScriptApp.AuthMode
枚舉中的值。- oldValue :編輯前的單元格值(如果有)。 僅在編輯范圍是單個單元格時可用。 如果單元格沒有以前的內容,將不確定。
- range :一個
Range
對象,表示已編輯的單元格或單元格區域。- source :一個
Spreadsheet
對象,表示腳本綁定到的Google Sheets文件。- triggerUid :產生此事件的觸發器的ID(僅可安裝觸發器)。
- user :表示活動用戶的
User
對象(如果可用)(取決於一組復雜的安全限制 )。- value :編輯后的新單元格值。 僅在編輯范圍是單個單元格時可用。
其中,我們將使用range
和value
。 我將把處理編輯的業務案例留給多個單元格范圍給你。 畢竟,Stack Overflow不是您獲得交鑰匙解決方案的地方;)
function onEdit(e) {
if (!e) throw new Error("You ran this from the script editor");
const edited = e.range;
if (edited.getNumRows() > 1 || edited.getNumColumns() > 1)
return; // multicell edit logic not included.
const sheet = edited.getSheet();
if (sheet.getName() !== "your workflow sheet name")
return;
// If the user edited a specific column, check if the value matches that
// in a different, specific column.
const col = edited.getColumn(),
advanceRightColumn = 5,
rightwardsCheckColumn = 2;
if (col === advanceRightColumn) {
var checkedValue = edited.offset(0, rightwardsCheckColumn - col, 1, 1).getValue();
if (checkedValue == e.value) // Strict equality may fail for numbers due to float vs int
edited.offset(0, 1, 1, 1).activate();
else
edited.activate();
return;
}
const endOfEntryColumn = 8,
endCheckColumn = 3,
startOfEntryColumn = 4;
if (col === endOfEntryColumn) {
var checkedValue = edited.offset(0, endCheckColumn - col, 1, 1).getValue();
if (checkedValue == e.value)
edited.offset(1, startOfEntryColumn - col, 1, 1).activate();
else
edited.activate();
return;
}
}
在您消化上述內容時,您會注意到您需要提供特定於您自己的工作流程的某些值,例如工作表名稱和正確的列。 如果編輯的列是若干列之一,則使用對相應“檢查”列的常量偏移或分別排序的偏移/目標列的數組,可以以相當簡單的方式修改上述內容以向右前進。 (這樣的修改幾乎肯定需要使用Array#indexOf
。)
需要注意的是,如果您的編輯數字可以表示為整數,則嚴格相等===
失敗,因為Google表格會將數字存儲為浮點數。 嚴格的相等性排除了類型轉換,並且沒有int
可以與float
完全相同。 因此,使用通用等式==
。 上述代碼不會等同於空白檢查單元格和刪除內容的結果。
方法參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.