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

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

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

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

onclick

onclickとはユーザーのクリック処理を指します。これは"onmousedown"(押下)と"onmouseup"(押上)の二つの事象の組み合わせです

Q&A

解決済

1回答

278閲覧

【GAS】スプレッドシートに文字列が入力されない

moka0716

総合スコア1

Google Apps Script

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

onclick

onclickとはユーザーのクリック処理を指します。これは"onmousedown"(押下)と"onmouseup"(押上)の二つの事象の組み合わせです

0グッド

1クリップ

投稿2024/02/02 18:30

実現したいこと

職員のファイル閲覧状況を把握するサイトを作成しています。
①スプレッドシートには2つのシートがあります。
シート1:A列[ファイル名], B列[URL]
シート2:A列[タイムスタンプ],B列[職員番号],C列[ファイル名]
②サイトに羅列されているファイル名をクリックすると"シート2"にタイムスタンプ,職員番号,ファイル名が自動的に入力されるようにしたいです。

発生している問題・分からないこと

aタグのonclick属性にて、"google.script.run"を用いてスプレッドシートに入力する関数(writeForm)を実行すると、スプレッドシートに値が入力されない(全て)。

該当のソースコード

GAS

1function doGet(e) { 2 3 const officeId = 1234; 4 5 const template = HtmlService.createTemplateFromFile('Table'); 6 template.deployURL = ScriptApp.getService().getUrl(); 7 template.formHTML = getFormHTML(officeId); 8 const htmlOutput = template.evaluate(); 9 return htmlOutput; 10} 11 12function getFormHTML(ID) { 13 14 var number = ID; 15 var sheet = SpreadsheetApp.getActive().getSheetByName("シート1"); 16 var data = sheet.getDataRange().getValues(); 17 18 var result ='<p>ファイル一覧</p>' 19 result += '<table border="5" class="lisence mb-5" id="targetTable">'; 20 21 for(var i=1;i<data.length;i++){ 22 var test = data[i][0].toString(); 23 var link = data[i][1].toString(); 24 var fileName = data[i][0].toString(); 25 result += '<tr style="text-align: center;">'; 26 result += '<td><a href="'+ link +'" onclick="google.script.run.writeForm(' + number +","+ test + ')">' + fileName + '</a></td>'; 27 result += '</tr>'; 28 } 29 result += '</table>'; 30 return result; 31} 32 33//---------------- writeForm関数:入力されたFormに従い、スプレッドシートに書き込む ------------------------ 34 35function writeForm (number,name) {//number,name 36 const today = new Date(); 37 const sheet = SpreadsheetApp.getActive().getSheetByName("シート2"); 38 const formList = [today,number,name]; 39 addRecords('シート2', [formList]); 40} 41 42//---------------- addRecords関数:指定した'スプレッドシート'の最終行に指定した[要素] を書き込む------ 43 44function addRecords(sheetName, records) { 45 const ss = SpreadsheetApp.getActiveSpreadsheet(); 46 const sheet = ss.getSheetByName(sheetName); 47 const lastRow = sheet.getLastRow(); 48 sheet.getRange(lastRow+1, 1, records.length, records[0].length).setValues(records); 49}

html

1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> 6 </head> 7 <body> 8 <form id="tttt" method="POST" action="<?= deployURL ?>"> 9 <? output._ = formHTML ?> 10 </form> 11 </body> 12</html>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

・変数"test"が数値の場合、google.script.runのwriteForm関数は正常に動作しました。
・変数"test"が文字列の場合、google.script.runのwriteForm関数は正常に動作されず、スプレッドシートに何も入力されません(特にエラーコード等はありません)。
・google.script.runの外でwriteForm関数を実行すると、数値・文字列ともに正常に動作しました。

補足

初めての投稿で質問の仕方に不備があればすみません。
様々なサイトを調べましたが、コードを書き始めて日が浅いため解決できませんでした(V8ランタイムのバグ?)。
ファイル名を外に引っ張れたらどうにかなるかと思いましたが未熟で上手くいきませんでした。
ご指南いただければ幸いです。
どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

HTMLにしたときのgoogle.script.run.writeFormへの引数が定数なのか変数なのかを意識するべきなのではないかと思います。
現状ですと

HTML

1<td><a href="LINK" onclick="google.script.run.writeForm(999,TEST)">FILENAME</a></td>

とwriteFormに渡される引数は999という定数とTESTという変数といった感じで展開されると思います。
正しくは

HTML

1<td><a href="LINK" onclick="google.script.run.writeForm(999,'TEST')">FILENAME</a></td>

とどちらも定数で渡されるべきなのではないでしょうか?

投稿2024/02/02 22:44

YAmaGNZ

総合スコア10266

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

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

moka0716

2024/02/03 15:22 編集

回答ありがとうございます。 ベストアンサーに選ばせていただきました。 引数に定数で渡すことを意識した結果、上手く動作しました。 具体的にはいきなりクリックしたファイル名を変数として入力することをやめて、以下の手順で行いました。 ①テーブルの行番号であるfor文の"i"を取得、その値を一旦スプレッドシートに格納する関数を作成し、onclickにて作動(引数はi(数値)のみ)。 ②スプレッドシートに格納した行番号からスプレッドシート内よりファイル名を取得。 ③改めてwriteForm関数を用いて、スプレッドシートにタイムスタンプ,職員番号,ファイル名を入力 回答者様の意図と合っているかは分かりませんが、大変参考になりました。 (多分もっと上手いやり方があるとは思いますが...) 重ねてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問