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次元配列として組み立てて、最後に一気に書き出すようにします。
図:無事にリンクだけを取り出せました。


