

例えばA列に文字列が入っているデータがあり  
画像のように途中まではリンクが設定されているとしたときに  
リンクが設定されていない文字列だけにハイパーリンクを設定していくようなスクリプトが組みたいと思っております。

色々、調べてはみたのですが、リンクが設定されているかの判定をする方法がわからず  
お判りになるかたがいれば、教えてください。

※数字は適当です。

[![画像の説明をここに入力](https://i.stack.imgur.com/niOg0.png)](https://i.stack.imgur.com/niOg0.png)


CC BY-SA 4.0
2023-01-18T04:27:34.077
93423
2023-03-25T22:47:16.877
56400
question
google-apps-script google-spreadsheet
GASでスプレッドシートの特定のセルの値にハイパーリンクが設定されているか判定する方法


理想的な解決策ではないと思いますが、リンク判定部分はこちらのサイトのコードが参考になるかと思います  
[【GASで便利に】シート内の全てのリンクを抽出する](https://myfunc.jp/items/00039/index.html)


CC BY-SA 4.0
2023-01-19T07:50:40.240
93447
2023-01-19T07:50:40.240
56458
93423
answer


こちらでリンクを取得できるのは、リンクのテキストが数値でない時のようです。

[code]

    const linkUrl = sheet.getRange('Q4').getRichTextValue().getLinkUrl();
    
    
[/code]

リンクのテキスト欄を文字列にすると上のメソッドでURLを取得できますが、  
リンクのテキスト欄が数値のときは、.getRichTextValue()のところで値がnullになり、.getLinkUrl()でエラーになります。  
なので、事前にセル範囲の表示形式を文字列に変えておく必要があります。  
表示形式が書式なし文字列のときは、  
.getRichTextValue().getLinkUrl()の値はリンクでないならnullになります。

ということでリンクかどうかを取得するスクリプトの例は次のようになります。

[code]

    //単一または複数のセル範囲がリンクかどうかを取得
    //戻り値:単一セル → true or false 複数セル→ true or false の配列
    function isLinkUrl(range) {
      const formats = range.getNumberFormats();
      range.setNumberFormat('@');
      const rows = range.getRichTextValues();
      const results = rows.map((r) => r.map((c) =>
        c.getLinkUrl() !== null
          ? true
          : false
      ));
      range.setNumberFormats(formats);
      if (results.length == 1 && results[0].length == 1) {
        return results[0][0];
      } else if (results.length > 0) {
        return results;
      }
    }
    //動作確認
    function confirmLink() {
      const sheet = SpreadsheetApp.getActiveSheet();
      const range = sheet.getRange('Q4:Q14');
      const values = isLinkUrl(range);
      console.log(values);
    }
    
[/code]


CC BY-SA 4.0
2023-03-24T08:15:54.353
94294
2023-03-25T22:47:16.877
2023-03-25T22:47:16.877
57654
57654
93423
answer