Trích xuất văn bản liên kết và URL từ một ô siêu liên kết


17

Giả sử tôi có một siêu liên kết trong ô A1: =hyperlink("stackexchange.com", "Stack Exchange")

Ở những nơi khác trong trang tính, tôi muốn có các công thức lấy văn bản liên kết và URL từ A1, riêng biệt. Tôi tìm thấy một cách để chỉ nhận được văn bản liên kết:

=""&A1 

(nối với chuỗi rỗng). Điều này trả về "Stack Exchange", không liên kết.

Làm cách nào để lấy URL (stackexchange.com)?


1
Đây là một tập lệnh có thể làm điều đó: Productforums.google.com/forum/#!topic/docs/ymxKs_QVEbs
Yisroel Tech

3
Lưu ý cho khách truy cập: nếu bạn đang tìm cách trích xuất URL từ một liên kết được định dạng không phải là =hyperlink()(một cái gì đó được dán vào một trang tính), thì xin lỗi: không có. Tốt nhất không nên dán văn bản phong phú vào bảng tính để bắt đầu.


1
lưu ý cho khách truy cập 2: bạn có thể nhận được cả hai nếu bạn tải xuống bảng tính bằng html. hay đúng hơn, chúng có thể dễ dàng trích xuất từ ​​html .... không lý tưởng, nhưng đó là một cách.
albert

Câu trả lời:


10

Sau khi thấy câu trả lời của Rubén, tôi quyết định viết một hàm tùy chỉnh khác cho tác vụ này, với các tính năng sau:

  1. Tham số được cung cấp dưới dạng một phạm vi, không phải là một chuỗi: đó là, =linkURL(C2)thay vì =linkURL("C2"). Điều này phù hợp với cách các tham số thường hoạt động và làm cho các tham chiếu mạnh mẽ hơn: chúng sẽ được duy trì nếu có ai đó thêm một hàng mới trên đầu trang.
  2. Mảng được hỗ trợ: =linkURL(B2:D5)trả về URL của tất cả hyperlinkcác lệnh được tìm thấy trong phạm vi này (và các ô trống cho các vị trí khác).

Để đạt được 1, tôi không sử dụng đối số được truyền bởi trang tính (sẽ là nội dung văn bản của ô mục tiêu), mà thay vào đó, phân tích công thức =linkURL(...)và trích xuất ký hiệu phạm vi từ đó.

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

hoạt động rực rỡ, mặc dù hơi chậm.
Dannid

Điều này về mặt kỹ thuật hoạt động, nhưng tôi tự hỏi liệu có thể tạo một siêu liên kết mới dựa trên linkURL()kết quả không. vd: =HYPERLINK(linkURL(C2),"new label")dường như không làm việc cho tôi.
skube

1
@skube Đó là một tác dụng phụ của cách tôi mã hóa hàm: nó chỉ có thể được sử dụng riêng chứ không thể sử dụng cùng với người khác. Bạn vẫn có thể tạo một siêu liên kết mới vì =hyperlink(D2, "new label")trong đó D2 có công thức linkURL. Ngoài ra, sử dụng chức năng tùy chỉnh của Rubén.

3

Câu trả lời ngắn

Sử dụng hàm tùy chỉnh để lấy chuỗi trích dẫn bên trong công thức ô.

Bài đăng bên ngoài được chia sẻ trong nhận xét của Yisroel Tech bao gồm một tập lệnh thay thế từng công thức trong phạm vi hoạt động bằng chuỗi trích dẫn đầu tiên trong công thức tương ứng. Sau đây là một điều chỉnh dưới dạng chức năng tùy chỉnh của tập lệnh đó.

/** 
 * 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
Hàm này tốt hơn cho tôi, vì nó có thể được sử dụng bên trong các biểu thức khác. Bằng cách này, nó sử dụng ký hiệu {"A1"} để giải quyết ô.
vatavale

2

Giả sử tế bào funciton siêu liên kết;

Chỉ cần tìm và thay thế =hyperlinkthành "siêu liên kết" hoặc "xyz"

Sau đó, bạn chỉ cần làm một số dữ liệu làm sạch để tách chúng. Hãy thử sử dụng văn bản tách thành cột hoặc =splitchức năng. Cả hai sẽ sử dụng ,như một dấu phân cách.

Một lần nữa thay thế "[dấu ngoặc kép] bằng [không có gì]

Có vẻ cách này đơn giản hơn ..

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.