[英]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.