簡體   English   中英

Google電子表格腳本

[英]Google-Spreadsheet Scripts

我在Google Spreadsheet文檔的特定工作表中有一列單元格。 此列使用內置的JOIN命令引用另一個工作表中的多個值:

=JOIN(", ",Regular!B3,Regular!B9,Regular!B10,Regular!B11,Regular!B12,Regular!B13,Regular!B14)

每個此類單元格的典型輸出是以逗號分隔的整數列表f.ex:

2,5,10,12,13

一些單元格使用如下范圍:

=JOIN(", ",Regular!B3:B9)

我想將這些單元格鎖定在公式中,例如:Regular!$ B $ 3,Regular!$ B:$ 9 ...

現在,我希望每個引用都鎖定列和行,但是讓我選擇行,列或兩者兼有的解決方案是一個更好的解決方案。

1)我沒有找到一種不使用自定義腳本的方法-我錯過了什么嗎?

2)我的自定義腳本解決方案未完成:

function eachCellInRange(range, op) {
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  for (var i = 1; i <= numRows; i++) {
    for (var j = 1; j <= numCols; j++) {
      op(range.getCell(i,j), i, j);
    }
  }
};

function lockCell(cell, row, col) {
  var formula = cell.getFormula();
  if(formula) {
    var startIdx = formula.indexOf('(');
    if(startIdx > 0) { 
      //!! REGEX HERE !! //
      cell.setValue(formula);
    }
  }
}

function lockRows() {
  var range = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getActiveRange();
  eachCellInRange(range, lockCell);
};

我需要制作一個正則表達式模式,該模式將標識公式的B3,B9 ...部分並將其更改為$ B $ 3,$ B $ 9 ...,但也不要在B1:B8情況下中斷

當前,所有引用都以SheetName為前綴! (例如,Regular!B9:B20),將來可能不會出現,因此首選最通用的解決方案。

我不確定這是否是您要尋找的東西,但是我將替換您當前擁有的一點:

if(formula) {
  var startIdx = formula.indexOf('(');
  if(startIdx > 0) { 
    //!! REGEX HERE !! //
    cell.setValue(formula);
  }
}

通過

if(formula.substring(0,6) == "=JOIN(") {
  formula = formula.replace(/([A-Z]+(?=[0-9]))/g, function($1) {
    return "$" +$1 + "$";
  });
  alert(formula);
  // cell.setValue(formula);
}

這樣可以確保該公式是一個JOIN公式。

另外,我對JS不太熟悉,但是我將其放在JSFiddle中以了解其運行方式。

警告:如果工作表名稱包含字母數字字符(字母和數字的混合),則此操作將失敗。

使用@Jerry的有用答案,我能夠使其適合我的需求:

function eachCellInRange(range, op) {
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  for (var i = 1; i <= numRows; i++) {
    for (var j = 1; j <= numCols; j++) {
      op(range.getCell(i,j), i, j);
    }
  }
};

var lockOn = 1, lockOff = -1, lockNop = 0,
    lockChar = '$', lockEmpty = '';

function lock2char(newLock, curLock) {
    if(newLock == lockNop) newLock = curLock;
    return (newLock > lockNop) ? lockChar : lockEmpty; 
}

function bool2lock(boolValue) {
    return (boolValue) ? lockOn : lockOff;
}

function lockCell(lockCol, lockRow, cell, row, col) {
  var formula = cell.getFormula();
  if(formula) {
    var startIdx = formula.indexOf('(');
    if(startIdx > 0) { 

      var newFormula = formula.replace(/([A-Z|\$]+(?=[0-9]))/g, function(part) {

        var prefix = lock2char(lockCol, (part.charAt(0) == lockChar));
        var suffix = lock2char(lockRow, (part.charAt(part.length -1) == lockChar));

        part = part.replace(/\$/g, '');

        return prefix + part + suffix;
      });

      cell.setFormula(newFormula);
    }
  }
}

function lockRows() {
  var range = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getActiveRange();
  eachCellInRange(range, lockCell.bind(this, lockOff, lockOn));
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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