하이퍼 링크 된 셀에서 링크 텍스트 및 URL 추출


17

셀 A1에 하이퍼 링크가 있다고 가정하십시오. =hyperlink("stackexchange.com", "Stack Exchange")

시트의 다른 곳에서 A1에서 링크 텍스트와 URL을 별도로 가져 오는 수식을 원합니다. 링크 텍스트를 얻는 방법을 찾았습니다.

=""&A1 

(빈 문자열로 연결). 연결되지 않은 "스택 교환"을 반환합니다.

URL을 얻는 방법 (stackexchange.com)?


1
이를 수행 할 수있는 스크립트는 다음과 같습니다. productforums.google.com/forum/#!topic/docs/ymxKs_QVEbs
Yisroel Tech

3
방문자 참고 사항 : =hyperlink()시트에 붙여 넣은 것이 아닌 서식이 지정된 링크에서 URL을 추출하는 방법을 찾고 있다면 죄송합니다. 서식있는 텍스트를 스프레드 시트에 붙여 넣어 시작하지 않는 것이 가장 좋습니다.


1
방문자에게 참고 2 : 스프레드 시트를 html로 다운로드하면 둘 다 얻을 수 있습니다. 또는 오히려 html에서 쉽게 추출 할 수 있습니다 .... 이상적이지는 않지만 방법입니다.
albert September

답변:


10

본 후 루벤의 답변을 필자는 다음과 같은 기능이 작업에 대해 다른 사용자 정의 함수를 작성하기로 결정했다 :

  1. 있다 : 매개 변수가없는 문자열로의 범위로 제공 =linkURL(C2)하는 대신 =linkURL("C2"). 이는 매개 변수가 일반적으로 작동하는 방식과 일치하며 참조를보다 강력하게 만듭니다. 누군가 새 행을 추가하면 유지됩니다.
  2. 배열이 지원됩니다. 이 범위에서 찾은 =linkURL(B2:D5)모든 hyperlink명령 의 URL을 반환합니다 (다른 장소의 경우 빈 셀).

1을 달성하기 위해 시트에 전달 된 인수 (대상 셀의 텍스트 내용)를 사용하지 않고 수식 =linkURL(...)자체 를 구문 분석하고 범위 표기법을 추출합니다.

/** 
 * Returns the URL of a hyperlinked cell, if it's entered with hyperlink command. 
 * Supports ranges
 * @param {A1}  reference Cell reference
 * @customfunction
 */
function linkURL(reference) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var formula = SpreadsheetApp.getActiveRange().getFormula();
  var args = formula.match(/=\w+\((.*)\)/i);
  try {
    var range = sheet.getRange(args[1]);
  }
  catch(e) {
    throw new Error(args[1] + ' is not a valid range');
  }
  var formulas = range.getFormulas();
  var output = [];
  for (var i = 0; i < formulas.length; i++) {
    var row = [];
    for (var j = 0; j < formulas[0].length; j++) {
      var url = formulas[i][j].match(/=hyperlink\("([^"]+)"/i);
      row.push(url ? url[1] : '');
    }
    output.push(row);
  }
  return output
}

조금 느리지 만 훌륭하게 작동합니다.
Dannid

이것은 기술적으로 작동하지만 linkURL()결과에 따라 새로운 하이퍼 링크를 만들 수 있는지 궁금합니다 . 예를 들어 =HYPERLINK(linkURL(C2),"new label")나를 위해 작동하지 않는 것 같습니다.
skube

1
@skube 함수를 코딩하는 방식의 부작용입니다. 다른 함수와 함께 사용할 수없고 자체적으로 만 사용할 수 있습니다. =hyperlink(D2, "new label")D2에 linkURL 수식이있는 것처럼 새 하이퍼 링크를 만들 수 있습니다 . 또는 Rubén의 사용자 정의 기능을 사용하십시오.

3

짧은 답변

사용자 정의 함수를 사용하여 셀 수식 안에 인용 된 문자열을 가져옵니다.

암호

Yisroel Tech 의 의견 에 공유 된 외부 게시물 에는 활성 범위의 각 공식을 해당 공식의 첫 번째 인용 문자열로 바꾸는 스크립트가 포함되어 있습니다. 다음은 해당 스크립트의 사용자 정의 기능으로 채택한 것입니다.

/** 
 * Extracts the first text string in double quotes in the formula
 * of the referred cell
 * @param {"A1"}  address Cell address.
 * @customfunction
 */
function FirstQuotedTextStringInFormula(address) {
  // Checks if the cell address contains a formula, and if so, returns the first
  // text  string in double quotes in the formula.
  // Adapted from https://productforums.google.com/d/msg/docs/ymxKs_QVEbs/pSYrElA0yBQJ

  // 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

  if(address && typeof(address) == 'string'){

    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 cell, cellValue, cellFormula, prefixFoundAt, suffixFoundAt, extractedTextString;

    cell = ss.getRange(address);
    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);
          return extractedTextString;
        }
      }
    } else {
      throw new Error('The cell in ' + address + ' does not contain a formula');
    }
  } else {
    throw new Error('The address must be a cell address');
  }
}

1
이 함수는 다른 식에서 사용할 수 있기 때문에 나에게 더 좋습니다. 그런데 { "A1"} 표기법을 사용하여 셀을 처리합니다.
vatavale

2

셀 에 하이퍼 링크 기능 있다고 가정합니다 .

찾아서 교체하십시오. =hyperlink"hyperlink"또는 "xyz"를

그런 다음 데이터 정리를 수행하여 분리해야합니다. 분할 텍스트를 열 또는 =split함수에 사용해보십시오 . 둘 다 사용합니다, 구분자로 됩니다.

다시 " [큰 따옴표]를 [없음]으로 바꿉니다.

이 방법은 더 간단 해 보인다 ..

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.