簡體   English   中英

Google表格根據單元格內容移動光標onEdit觸發器

[英]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觸發器調用的函數的一個關鍵原則是它有一個事件對象,其中包含有關已編輯的單元格的數據:

  • authModeScriptApp.AuthMode枚舉中的值。
  • oldValue :編輯前的單元格值(如果有)。 僅在編輯范圍是單個單元格時可用。 如果單元格沒有以前的內容,將不確定。
  • range :一個Range對象,表示已編輯的單元格或單元格區域。
  • source :一個Spreadsheet對象,表示腳本綁定到的Google Sheets文件。
  • triggerUid :產生此事件的觸發器的ID(僅可安裝觸發器)。
  • user :表示活動用戶的User對象(如果可用)(取決於一組復雜的安全限制 )。
  • value :編輯后的新單元格值。 僅在編輯范圍是單個單元格時可用。

其中,我們將使用rangevalue 我將把處理編輯的業務案例留給多個單元格范圍給你。 畢竟,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM