スプレッドシート上のセルにあるリンクを
踏んで違うページに飛んだ時に
スプレッドシート上のセルにある踏んだリンクが
今後踏めないように(非アクティブか削除)するには、
どのようなコードが必要なのでしょうか?
知識のある方ご教授下さい。
稚拙な文章で申し訳ないです。
(GASを使っても使わなくてもいいです。)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/30 05:04
退会済みユーザー
2019/01/04 07:31
2019/01/04 21:11
退会済みユーザー
2019/01/04 23:12
回答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
総合スコア12705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/09 19:10 編集
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:閲覧済み) |
---|---|---|
1 | https://teratail.com/feed/new/1 | done |
2 | https://teratail.com/feed/new/2 | done |
3 | https://teratail.com/feed/new/3 | done |
4 | https://teratail.com/feed/new/4 | done |
5 | https://teratail.com/feed/new/5 |
投稿2019/01/05 03:22
編集2019/01/10 10:59退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。