質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

2回答

944閲覧

スプレッドシート上のセルにあるリンクの非アクティブ化(それか削除)について

damaa

総合スコア20

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2018/12/29 12:07

スプレッドシート上のセルにあるリンクを
踏んで違うページに飛んだ時に
スプレッドシート上のセルにある踏んだリンクが
今後踏めないように(非アクティブか削除)するには、
どのようなコードが必要なのでしょうか?
知識のある方ご教授下さい。
稚拙な文章で申し訳ないです。
(GASを使っても使わなくてもいいです。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2018/12/30 05:01 編集

消していいのですよね?消していいって書いてましたごめんなさい
damaa

2018/12/30 05:04

消すというよりも自動で消えるという事です。
退会済みユーザー

退会済みユーザー

2019/01/04 07:31

スプレッドシートはクリックイベントを検知できないようなので 別のやり方を探すしかなさそうですね。 ボタンを一つだけ設置してそのボタンを押すと、そのURLを開いて、そのURLを無効化、 次のURLを対象にする とか もしくはスプレッドシートからhtmlを作成するとかですかね。 (urlをクリックすると、そのurlが開かれて、その部分のタグは削除するjavascriptを仕込む)
damaa

2019/01/04 21:11

NETACHIL様 返信遅くなり申し訳ないです。 なるほどです。 URLを無効化はリンクを解除してテキスト化という感じでしょうか? で、そのセルがテキストならば次を対象にする感じでしょうか。
退会済みユーザー

退会済みユーザー

2019/01/04 23:12

それでもいいと思いますし、隣のセルをチェックフラグにするとかですかね。
guest

回答2

0

将来参照しに来た方向けに、明記しておきたいのは、セルのonClickイベントは発行されないということ

逆にクリックをしたことがイベント発火するような仕組みにすればよい
→下図のようなチェックボックスとすれば、チェックの付け外しが編集イベントになる
イメージ説明

で、下記のonEditを編集時トリガーにセットしてやれば、チェックがオンになったときに、B列のアドレスを別タブに開いて、同時に図のB7のようにセル内容を消すことができる。
(B列にアドレスが入っていることを前提にしているが、チェックをかけたほうがいい気もする)

javascript

1function onEdit(e) { 2 const sheetName = "URL記載シート"; 3 const workingSheet = e.range.getSheet(); 4 if(workingSheet.getSheetName() !== sheetName || e.value !== "TRUE") {return;} 5 const rightCell = workingSheet.getRange(e.range.getRow(), e.range.getColumn() + 1); 6 const url = rightCell.getValue(); 7 openTab(url); 8 rightCell.setValue(""); 9} 10function openTab(url) { 11 const html = "<script>window.open('" + url + "');google.script.host.close();</script>"; 12 const userInterface = HtmlService.createHtmlOutput(html); 13 SpreadsheetApp.getUi().showModalDialog(userInterface, 'Open Tab'); 14}

ただ、チェックをつけてから、別タブが展開するまでにはそれなりにラグがあり、実用性は微妙な気はする

どうやるかという質問だと、そのままの実現ができないときに、回答のしようがなくなるので、何がしたいを前提に、こういう方法を考えてます、という感じで目的を書いたほうが有意義な回答が得られると思う(もっと楽で便利な方法があるのではないかと想像しています、特に人間がクリックをしていくことに疑問を持っています)

投稿2019/01/08 06:04

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

damaa

2019/01/09 19:10 編集

papinianus様 返信遅くなり申し訳ないです。 丁寧なご回答ありがとうございます。わかりやすい写真、コードも書いていただきありがとうございました。 なるほどです。チェックボックスを使う手があるのですね。 >何がしたいを前提に、こういう方法を考えてます、という感じで目的を書いたほうが有意義な回答が得られると思う(もっと楽で便利な方法があるのではないかと想像しています、特に人間がクリックをしていくことに疑問を持っています) 言葉足らずな文章で質問してしまいお手数をおかけしました。 私の稚拙な文章に疑問を持っていただき、少しでも私が思っている(欲しい)Aへ 近づけてくださる助言のお言葉に感謝です。 下記長文になりますが失礼します。 ▽希望 人間がクリックしていくのではなく、(スプレッドシートで直接シートにクリックではなく) GASを使った(htmlの)ページがありそのページにスプレッドシート内のリンクを1つ表示、 そしてそのページのリンクがクリックされると、 次アクセスするときには次のセルのリンクが表示されるようになっていて欲しい (一度使用したリンクは使われないで欲しい) ▽(私が考える手順) 踏まれたリンクはスプレッドシート内で消され、空セルかどうかを条件分岐にし、次のセルのリンクをページに表示 ▽現状 上記の条件分岐ができない為、違うphpファイルを作成しアクセスカウンターを使い、 その数字をGASで作ったhtmlページに飛ばして n番目に訪問した人に対してシートのn番目のリンクを表示 ******************************* この方法で使用はできるのですが用意したリンクが phpファイル→GAS(html)→スプレッドシート となり、phpファイルでとったアクセスカウンターの番号が飛び飛びになり、 (phpファイルだけで離脱する人がいる為) 用意してあるURLが使用されるものもあればないものもある という事になっています。 (用意したURLは全て使いたい) といった感じです。長文を読んでいただきありがとうございました。
guest

0

ベストアンサー

新規追加 1/10 19:00

少し変更してみました。

変更点

  • スプレッドシートの先頭の値をとる
  • クリックされたら先頭行を削除する

GoogleAppScript

1var ssid="1cuutoL5aEHFG4iubRrRXTL1b3fSr4BN4b1MiNVHHKEA" 2function doGet() { 3 var htmlOutput = HtmlService.createTemplateFromFile("index").evaluate(); 4 return htmlOutput; 5} 6 7function getUrl(){ 8 var spreadsheet = SpreadsheetApp.openById(ssid); 9 var sheets = spreadsheet.getSheets(); 10 var sheet = sheets[0]; 11 var range = sheet.getRange(1,1,1,1); 12 var data = range.getValue(); 13 Logger.log(data); 14 return data; 15} 16 17function getUrlAndRemove(url){ 18 var spreadsheet = SpreadsheetApp.openById(ssid); 19 var sheets = spreadsheet.getSheets(); 20 var sheet = sheets[0]; 21 sheet.deleteRow(1); 22 var range = sheet.getRange(1,1,1,1); 23 var data = range.getValue(); 24 Logger.log(data); 25 return data; 26} 27

html

1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 </head> 6 <span id="randomLink"> 7 </span> 8 <body> 9 10 11<script> 12 13function createRandomLink(e){ 14 console.log(e); 15 var el = document.getElementById('randomLink'); 16 el.innerHTML = e; 17 el.onclick = function(){ 18 window.open(e); 19 google.script.run.withSuccessHandler(createRandomLink).getUrlAndRemove(); 20 } 21} 22google.script.run.withSuccessHandler(createRandomLink).getUrl(); 23 24 </script> 25 </body> 26</html>

スプレッドシートの形式(URLのみ一列)

URL
https://teratail.com/feed/new/1
https://teratail.com/feed/new/2
https://teratail.com/feed/new/3
https://teratail.com/feed/new/4

旧回答

期待に添えているか不明ですが、作ってみました。

GoogleAppScript

1function doGet() { 2 Logger.log("get"); 3 var htmlOutput = HtmlService.createTemplateFromFile("index").evaluate(); 4 return htmlOutput; 5} 6 7 8function data() { 9 var spreadsheet = SpreadsheetApp.openById("1QbXUZv0g4nLDHwchH1hUkFkyjPb_JmJIyXFYZBL62W8"); 10 var sheets = spreadsheet.getSheets(); 11 var sheet = sheets[0]; 12 var range = sheet.getRange(1,1); 13 var data = range.getValue(); 14 Logger.log(data); 15 return data; 16} 17 18function init(){ 19 var spreadsheet = SpreadsheetApp.openById("1QbXUZv0g4nLDHwchH1hUkFkyjPb_JmJIyXFYZBL62W8"); 20 var sheets = spreadsheet.getSheets(); 21 var sheet = sheets[0]; 22 var lastRow = sheet.getLastRow(); 23 var range = sheet.getRange(1,1,lastRow,3); 24 var data = range.getValues(); 25 Logger.log(data); 26 return data; 27} 28 29function deactivate(id){ 30 var spreadsheet = SpreadsheetApp.openById("1QbXUZv0g4nLDHwchH1hUkFkyjPb_JmJIyXFYZBL62W8"); 31 var sheets = spreadsheet.getSheets(); 32 var sheet = sheets[0]; 33 var lastRow = sheet.getLastRow(); 34 var range = sheet.getRange(id,3); 35 var data = range.setValue("done"); 36 return; 37}

html(index.htm)

1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 </head> 6 <ul id="output"> 7 </ul> 8 <body> 9 10 11 <script> 12 function onSuccess(data) { 13 init(data); 14 } 15 function onSuccess2(id){ 16 console.log("remove:" + id); 17 } 18 google.script.run.withSuccessHandler(onSuccess).init(); 19 20 function init(data) 21{ 22 23 data.forEach(function(e){ 24 console.log(e); 25 var li = document.createElement('li'); 26 li.innerHTML = e[1]; 27 li.setAttribute('id',e[0]); 28 if(e[2]=="done"){ 29 li.style.textDecoration = "line-through"; 30 } 31 li.onclick = function(){ 32 window.open(e[1]); 33 this.style.textDecoration = "line-through"; 34 console.log(this.id); 35 google.script.run.withSuccessHandler(onSuccess2).deactivate(this.id); 36 37 } 38 var parent_object = document.getElementById("output"); 39 parent_object.appendChild(li); 40 }) 41 42} 43 </script> 44 </body> 45</html> 46 47 48

スプレッドシートの形式

行番号URLチェックフラグ(done:閲覧済み)
1https://teratail.com/feed/new/1done
2https://teratail.com/feed/new/2done
3https://teratail.com/feed/new/3done
4https://teratail.com/feed/new/4done
5https://teratail.com/feed/new/5

投稿2019/01/05 03:22

編集2019/01/10 10:59
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

damaa

2019/01/06 08:46

NETACHIL様 返信遅くなり申し訳ございません。 すごくわかりやすいコードを作っていただき感激です。 説明もわかりやすく、感動いたしました。 活用したいと思います。 ベストアンサーに選ばして頂きました。
damaa

2019/01/11 05:52

NETACHIL様 2回目のご回答ありがとうございます。 あまりwithSuccessHandlerを使った事がないので、 こういう風なコードを書くのかとすごく感動しております。 NETACHIL様のおかげで思っていた事を現実にする事ができました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問