【发布时间】:2015-07-09 02:35:11
【问题描述】:
我正在尝试从 Google 电子表格中的公式中提取文本字符串。具体来说,我有一列包含HYPERLINK 公式,我想从中使用自定义函数创建另一个列,其中包含提取的公式文本,以便在具有=HYPERLINK("https://twitter.com/jrosenberg6432/status/617013951184957440") 的单元格上调用该函数将返回@987654324 @ 在另一个单元格中。
我从this help forum 发现了这个非常有用的功能:
/** Extract a text string in double quotes from the formulas in selected cells
*/
function replaceFormulasWithFirstQuotedTextStringInFormula() {
// Goes through all the cells in the active range (i.e., selected cells),
// checks if a cell contains a formula, and if so, extracts the first
// text string in double quotes in the formula and stores it in the cell.
// The formula in the cell is replaced with the text string.
// see https://productforums.google.com/d/topic/docs/ymxKs_QVEbs/discussion
// These regular expressions match the __"__ prefix and the
// __"__ suffix. The search is case-insensitive ("i").
// The backslash has to be doubled so it reaches RegExp correctly.
// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp
var prefix = '\\"';
var suffix = '\\"';
var prefixToSearchFor = new RegExp(prefix, "i");
var suffixToSearchFor = new RegExp(suffix, "i");
var prefixLength = 1; // counting just the double quote character (")
var ss = SpreadsheetApp.getActiveSpreadsheet();
var activeRange = ss.getActiveRange();
var cell, cellValue, cellFormula, prefixFoundAt, suffixFoundAt, extractedTextString;
// iterate through all cells in the active range
for (var cellRow = 1; cellRow <= activeRange.getHeight(); cellRow++) {
for (var cellColumn = 1; cellColumn <= activeRange.getWidth(); cellColumn++) {
cell = activeRange.getCell(cellRow, cellColumn);
cellFormula = cell.getFormula();
// only proceed if the cell contains a formula
// if the leftmost character is "=", it contains a formula
// otherwise, the cell contains a constant and is ignored
// does not work correctly with cells that start with '=
if (cellFormula[0] == "=") {
// find the prefix
prefixFoundAt = cellFormula.search(prefixToSearchFor);
if (prefixFoundAt >= 0) { // yes, this cell contains the prefix
// remove everything up to and including the prefix
extractedTextString = cellFormula.slice(prefixFoundAt + prefixLength);
// find the suffix
suffixFoundAt = extractedTextString.search(suffixToSearchFor);
if (suffixFoundAt >= 0) { // yes, this cell contains the suffix
// remove all text from and including the suffix
extractedTextString = extractedTextString.slice(0, suffixFoundAt).trim();
// store the plain hyperlink string in the cell, replacing the formula
cell.setValue(extractedTextString);
}
}
}
}
}
}
/** Add a custom menu to the active spreadsheet, containing a single menu item
* for invoking the replaceFormulasWithFirstQuotedTextStringInFormula() function.
* The onOpen() function is automatically run when the spreadsheet is opened.
*/
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "Replace formulas with text strings",
functionName : "replaceFormulasWithFirstQuotedTextStringInFormula"
}];
ss.addMenu("Extract", entries);
}
但是,此函数用提取的文本替换原始单元格,而不是保留原始单元格中的内容并在另一列中返回输出。
我试图编辑代码,但我是一个 Javascript 新手,所以尽管这可能是对它的小修改,但我还是想问一下。
【问题讨论】:
标签: javascript google-apps-script google-sheets