Google Apps Scriptでリンク付きセルからURLだけを取り出す【GAS】

ウェブで見かけた質問に対しての解答として作ってみました。Googleスプレッドシートでセルの内容に対してハイパーリンクが設定されてる場合、そのURLのみを取り出して別のセルに書き出すスクリプトになります。

ハイパーリンクはSpreadsheet上では「リッチテキスト」の1種とみなされる為、通常のgetValuesではなくgetRichTextValuesを使うのと、getLinkUrlを使うのがポイントです。

今回利用するサンプル

recordシートのA列にある「ハイパーリンクが設定されてるデータ」を一括で取得し、その中のURLだけを取り出してtargetシートのA列に書き出すスクリプトになっています。

図:ハイパーリンクが設定されてるセル

ソースコード

単純にコピーするコードの場合

//範囲丸ごとコピー
function rangeCopy(){
  //スプレッドシートを取得する
  let ss = SpreadsheetApp.getActiveSpreadsheet();

  //シートを取得
  let record = ss.getSheetByName("record"); //コピー元
  let target = ss.getSheetByName("target"); //コピー先

  //最終行を取得
  let endrow = record.getLastRow();

  //コピペ実行
  record.getRange("A2:A" + endrow).copyTo(target.getRange(2, 1, endrow, 1),SpreadsheetApp.CopyPasteType.PASTE_NORMAL,false)
}

上記は単純にrecordシートからtargetシートへとコピーしてるだけのコードです。copyToの場合書式もそのままに完全コピーします。第三引数のfalseは転置する場合はTrueにしますが、あまり使う機会はないかと。

但しこれではURLだけ取り出すといったことは出来ません。

URLを取り出して貼り付けるコード

//リンクだけ抽出して貼り付け
function rangePickUrl(){
  //スプレッドシートを取得する
  let ss = SpreadsheetApp.getActiveSpreadsheet();

  //シートを取得
  let record = ss.getSheetByName("record"); //コピー元
  let target = ss.getSheetByName("target"); //コピー先

  //リッチテキストとして取得
  let richman = record.getRange("A2:A").getRichTextValues();

  //recordのURLだけを取得
  let richarr = [];

  //リンクだけを取り出す
  for(let i = 0;i<richman.length;i++){
    //レコードを一個取り出す
    let rec = richman[i];

    //リンクだけ取り出す
    let tempurl = rec[0].getLinkUrl();

    //配列に追加する
    richarr.push([tempurl]);
  }

  //コピー先に書き出す
  let lastColumn = richarr[0].length;   //カラムの数を取得する
  let lastRow = richarr.length;         //行の数を取得する
  target.getRange(2,1,lastRow,lastColumn).setValues(richarr); 

}

URLだけ取り出す場合には、getValuesではなくgetRichTextValuesを利用してリッチテキストを取り出します。単体のセルの場合はgetRichTextValueとなるので注意。

取り出した塊はオブジェクトが詰まった配列で返ってくるので、ループで一個ずつ取り出して、getLinkUrlにてハイパーリンクを取り出すことが可能です。rec[0]を指定していますが、二次元配列の常に0番目にしかオブジェクトは入っていません。

取得したものを別の2次元配列として組み立てて、最後に一気に書き出すようにします。

図:無事にリンクだけを取り出せました。

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)