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

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

新規登録して質問してみよう
ただいま回答率
85.30%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

Q&A

解決済

1回答

3120閲覧

GASのExceptionエラー解消

mkkc

総合スコア2

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

0グッド

1クリップ

投稿2023/08/29 06:34

実現したいこと

google フォームで、自分に関連する項目をプルダウンメニューから選択し、送信ボタンを押すと、
同時にその自分に関連がある内容一覧がcsvファイルで自動でダウンロードできるようにしたいです。

自分に関連するところの一覧は、スプレッドシート上で、filter関数を使って、フィルタリングしてあるので、
そのシートをcsvで落とすだけです。

色々と調べて

前提

参考ホームページ
https://technical.verybestcbp.com/downloadcsv/
にたどり着きました。
とても簡単にCSV化、しかもexcelでの文字化けの解消までしてくれ、
スプレッドシートのGASでは実行できました。
CSVもダウンロードできました。
しかし、トリガーを使って、フォーム送信時に上記の関数を実行しようとしたら
Exception: Cannot call SpreadsheetApp.getUi() from this context.
** at DownloadCsvFile(コード:261:18)**
エラーが出ます。

該当のソースコード

// JSを用いてCSVファイルをダウンロードする
function DownloadCsvFile() {
// dialog.html でにHTMLファイルを生成する
// evaluate() は dialog.html 内の GAS を実行するため( <?= => の箇所)
const html = HtmlService.createTemplateFromFile("dialog").evaluate()
// 上記HTMLファイルをダイアログ出力
SpreadsheetApp.getUi().showModalDialog(html, "ダウンロード中です")
}

// -----以下はJS側で使用------
// シート名からファイル名を作成する
// return ファイル名
function getFileName() {
const sheets = SpreadsheetApp.openById('1BjZhmDbUFPICwhMZVcr2Wc90Uj52dMO9Sna8tCzuksY').getSheets();
const sheet7 = sheets[5];
const now = new Date()
const datetime = Utilities.formatDate( now, 'Asia/Tokyo', 'yyyyMMddHHmm')
// アクティブシート名+現在日時
return sheet7.getName() + '_' + datetime + '.csv'
}

// データの取得
function getData() {

// スプレッドシート上の値を二次元配列の形で取得
const sheets = SpreadsheetApp.openById('1BjZhmDbUFPICwhMZVcr2Wc90Uj52dMO9Sna8tCzuksY').getSheets();
const sheet7 = sheets[5];

// const values = sheet.getDataRange().getValues()
const values = sheet7.getDataRange().getDisplayValues()

// 二次元配列をCSV形式のテキストデータに変換
let dataArray = []
for (let i = 0; i < values.length; i++) {
dataArray.push(values[i].join(","))
}
return dataArray.join("\r\n"); // 改行コード
}

試したこと

スプレッドシートのGAS上からは実行できました。
トリガーでフォーム送信時にするとできなくなります。

フォームの側のGASに入れて実行しても同じようなエラーでした。
Exception: Cannot call SpreadsheetApp.getUi() from this context.

補足情報(FW/ツールのバージョンなど)

実は、上記のようなGASが2つあり、2つのフォームから、それぞれ別のシートをCSVでダウンロードできるようにしたいです。
そこで、
https://tgg.jugani-japan.com/tsujike/2021/05/gas-form4/
を参考に、分岐で実行できるようにしたいのですが、
その前段階のトリガーの段階で失敗します。
どうぞよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

「Exception: Cannot call SpreadsheetApp.getUi() from this context.」というエラーについてのみ言及します。

SpreadsheetApp.getUi().showModalDialog

これは、「ダウンロード中」というメッセージダイアログを出すためのコードですが、このエラーは解消できません。

なぜならば、このコードにおける SpreadsheetApp.getUi() は、スプレッドシートから直接呼び出す形でしか実行できない仕様になっているからです。

スプレッドシートからではなく、フォームを経由して間接的に実行することはできません。

投稿2023/08/29 13:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mkkc

2023/08/31 08:46

ありがとうございました。できないということが分かっただけでもよかったです。 また別の方法を模索してみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問