แยกข้อความลิงค์และ URL จากเซลล์ไฮเปอร์ลิงก์


17

สมมติว่าฉันมีไฮเปอร์ลิงก์ในเซลล์ A1: =hyperlink("stackexchange.com", "Stack Exchange")

ที่อื่นในแผ่นงานฉันต้องการมีสูตรที่ได้รับข้อความลิงก์และ URL จาก A1 แยกต่างหาก ฉันพบวิธีรับข้อความลิงก์:

=""&A1 

(การต่อข้อมูลกับสตริงว่าง) ส่งคืน "การแลกเปลี่ยนสแต็ก" ซึ่งไม่ได้เชื่อมโยง

วิธีรับ URL (stackexchange.com)


1
นี่คือสคริปต์ที่สามารถทำได้: productforums.google.com/forum/#!topic/docs/ymxKs_QVEbs
Yisroel Tech

3
หมายเหตุถึงผู้เยี่ยมชม: หากคุณกำลังมองหาวิธีที่จะแยก URL จากลิงค์ที่มีการจัดรูปแบบที่ไม่ใช่=hyperlink()(สิ่งที่ถูกวางลงในแผ่นงาน) ขออภัยด้วย: ไม่มี เป็นการดีที่สุดที่จะไม่วาง Rich Text ลงในสเปรดชีตเพื่อเริ่มต้น


1
หมายเหตุถึงผู้เยี่ยมชม 2: คุณสามารถรับทั้งคู่ได้หากคุณดาวน์โหลดสเปรดชีตเป็น html หรือค่อนข้างสกัดได้ง่ายจาก html .... ไม่เหมาะ แต่เป็นวิธี
อัลเบิร์ต

คำตอบ:


10

หลังจากเห็นคำตอบของRubénฉันตัดสินใจที่จะเขียนฟังก์ชั่นที่กำหนดเองที่แตกต่างกันสำหรับงานนี้ด้วยคุณสมบัติดังต่อไปนี้:

  1. พารามิเตอร์ให้เป็นช่วงที่ไม่เป็นสตริง: นั่นคือแทน=linkURL(C2) =linkURL("C2")สิ่งนี้สอดคล้องกับวิธีการทำงานของพารามิเตอร์และทำให้การอ้างอิงมีประสิทธิภาพมากขึ้น: พวกเขาจะได้รับการดูแลหากมีใครเพิ่มแถวใหม่ที่ด้านบน
  2. รองรับอาร์เรย์: =linkURL(B2:D5)ส่งคืน URL ของhyperlinkคำสั่งทั้งหมดที่พบในช่วงนี้ (และเซลล์ว่างสำหรับสถานที่อื่น)

เพื่อให้บรรลุ 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เป็น "ไฮเปอร์ลิงก์" หรือ "xyz"

จากนั้นคุณเพียงแค่ทำการล้างข้อมูลเพื่อแยกพวกเขาออก ลองใช้ข้อความแยกเป็นคอลัมน์หรือ=splitฟังก์ชั่น ทั้งสองจะใช้,เป็นตัวคั่น

แทนที่"[เครื่องหมายคำพูดคู่] ด้วย [nothing] อีกครั้ง

ดูเหมือนว่าวิธีนี้จะง่ายกว่านี้ ..

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.