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

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

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

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

受付中

html内のgoogle.script.runで呼び出す関数に値を引き渡したい

chocolatxx
chocolatxx

総合スコア20

Google Apps Script

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

1回答

0評価

0クリップ

347閲覧

投稿2022/08/01 15:16

編集2022/08/05 23:33

前提

GASで業務管理アプリを作成しています。

実現したいこと

調べた情報を元に最低限の機能については実装することができました。
もう1点見直しをしたい仕様があります。

現在は、
Session.getActiveUser().getEmail();
を使ってgoogleアカウントの判定をし、対象のhtml(※メインページ)を呼び出しています。
この仕様だと本人以外の業務のアサイン状況が確認できない仕様となっています。

以下の仕様で、googleアカウントに紐づく情報(※ID)を受け渡し、
各担当者のメインページを呼び出したいと考えていますがそもそも可能なのでしょうか。

画面遷移
1.本人のメインページを呼び出す。
2.メインページ内に各担当者のIDを含んだリンクを記述しておく。
3.リンクからhtmlを呼び出した際に、IDに基づいたメインページを呼び出す。
※ここでは自分以外の担当者のメインページを開く。

発生している問題・エラーメッセージ

現状試してみた方法だと、IDの受け渡しができない状態です。
ページの情報はIDを元に、スプレッドシートを指定し、スプレッドシートの内容を
反映しているためメインページには何も表示されません。

該当のソースコード

index.html

<!DOCTYPE html> <html> <head> <base target="_top"> <?!= HtmlService.createHtmlOutputFromFile('css').getContent(); ?> </head> <body> <div class='contents'> <div class='main'> <h3><?=name?>の管理</h3> <div class='table_Layout'> <p>業務1</p> <table id='業務1'></table> </div> </div><br> <div class="link"> <a id="link" href="<?= getAppUrl() ?>?p=manage&n=hogehoge">このリンクから他の人のページに移動したい</a> </div> </div> </body> </html> <!--jQueryのCDN読み込み--> <script src="https://code.jquery.com/jquery-3.6.0.slim.min.js" integrity="sha256-u7e5khyithlIdTpu22PHhENmPcRdFiHRjhAuHcs05RI=" crossorigin="anonymous"> </script> <script>    //webページの読み込み時に実行 window.onload = function(){ //エクセルDBからアサイン状況を表示 google.script.run.withSuccessHandler(function(dt) { for(var i = 0; i<dt.length - 1; i++) { var date = new Date(dt[i][0]); var dateText = `${date.getMonth() + 1}月${date.getDate()}日`; $('#業務1').append(`<input type="button" id="${dt[i][3]}" value="${dateText + '_' + 業務名をDB(スプレッドシート)から取得)'}" onclick="window.open('<?= getAppUrl();?>?p=assign&d=${date}&f=${dt[i][1]}&n=${dt[i][2]}','_blank','width=280,height=400')">`); } }).values1get();

gs

if(page == 'index' || page == null) { const ssID = SpreadsheetApp.openById('1HCaDY19PHQLkWMKH7YqNlgyLX-GNSF4v6GKB8sRbLvQ'); const sheetID = ssID.getSheetByName('ID'); const rowCountID = sheetID.getLastRow(); const regAccountID = sheetID.getRange(2,3,rowCountID - 1,1).getValues(); var userID = Session.getActiveUser().getEmail(); const regssDBName = sheetID.getRange(2,2,rowCountID - 1,1).getValues(); for(let i = 0; i<= rowCountID - 1; i++) { if(regAccountID[i] == userID) { var ssDBName = regssDBName[i]; break; } } let htmlOutput = HtmlService.createTemplateFromFile('index'); htmlOutput.name = ssDBName; return htmlOutput.evaluate().setTitle('業務管理').addMetaTag('viewport', 'width=device-width,initial-scale=1'); }

gs

function values1get() { //ログイン中のgmailアカウントを元に、IDファイルからデータベースのIDを取得 const ssID = SpreadsheetApp.openById('全担当者のIDを保存しているスプレッドシートのID'); const sheetID = ssID.getSheetByName('ID'); let rowCountID = sheetID.getLastRow(); const regAccountID = sheetID.getRange(2,3,rowCountID - 1,1).getValues(); const userID = Session.getActiveUser().getEmail(); const regssDbID = sheetID.getRange(2,4,rowCountID - 1,1).getValues(); for(let i = 0; i<= rowCountID - 1; i++) { if(regAccountID[i] == userID) { const ssDbID = regssDbID[i]; //管理画面に業務進捗を出力 var ss = SpreadsheetApp.openById(ssDbID); var sheet = ss.getSheets(); //各シートのデータを配列に格納 var rowCount = sheet[0].getLastRow(); var dataRange = sheet[0].getRange(2,1,rowCount,4); const values1 = dataRange.getValues(); return values1; break; } else { //エラー時の処理いれる } } }

実現したいこと

indes.html内に仮で『n=hogehoge』と入れていますが、何らかの形でリンクを踏む際に担当者のID情報を受け渡す。
values1get()の関数で呼び出すスプレッドシートのIDをgetEmail()によるログイン中のIDを、リンクを踏んだ際に受け渡されたID情報を元に参照する担当者のDBを設定したい。

ご教授いただけますと幸いです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

qnoir

2022/08/02 00:26 編集

そもそもの問題がどこにあるかの切り分けが必要かと思うのですが、 下記について確認されましたか? ・const userID = Session.getActiveUser().getEmail(); のところでメールアドレス(またはGoogleアカウントを区別するための文字列)が確実に取得できているか? (確認方法:values1get関数の冒頭で console.log(Session.getActiveUser().getEmail()); として保存、デプロイし、デプロイしたページを一度開いた後、GASエディタ左の「実行数」アイコンをクリックしてログを開いて、期待するuserIDがきちんと出力されているかをチェックする) ↓ それが取得できているならば、そのメールアドレス文字列をもとに、スプレッドシートからきちんと目当てのデータ(ID)が取得できているか ↓ IDがきちんと取得できているならば、gasのコードまではきちんと動いているということなので、あとはhtml側の問題となります。 たとえばページを開いた状態でctrl+shift+Iを押してデベロッパーツールを開いた際に コンソールに何かエラーが発生していればそれを書いてください。 (スプレッドシートの内容[どの行・どの列にどのようなデータが入っているのか]が一切記載されておらず、またhtmlのソースも一部しか記載されていないので現状はこちらで再現できず原因の追究のしようがありません) 「リンクから開いたhtml自体にはIDを受け渡すことはできました」というのは、getAppUrl()関数とdoGet関数が正しく動いていることだけしか証明していません。
chocolatxx

2022/08/02 00:33

回答ありがとうございます。 また、質問内容に不足が多々ある状況で申し訳ありません。 現状、getEmailからIDの紐付けをした場合、GASの処理は問題なく実行されています。 (複数アカウントで確認) 最後にいただいたご指摘はおっしゃる通りで、一旦はそのデータを渡せないかと考えましたが実現できず質問をさせていただきました。 今すぐにコードの貼り付けが難しいため、改めてコンソールのエラーも含め確認後、質問内容に追記したいと思います。 またお時間があれば回答いただけますと幸いです。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google Apps Script

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