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

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

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

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

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Apps Script

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

Q&A

解決済

1回答

3937閲覧

【GAS】スプレッドシートのシートごとにエクセルファイルを生成

shirogohan

総合スコア14

Google スプレッドシート

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

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Apps Script

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

0グッド

0クリップ

投稿2022/08/03 05:17

編集2022/08/05 06:05

前提

GAS超初心者です。
ご教授いただけますと大変幸いです。

実現したいこと

スプレッドシートのシートごとにエクセルファイルを生成し、GoogleDriveに保存したい。

エラー

なぜかコードのようなものが書かれたHTMLファイルが生成されてしまう。

参考サイト

https://note.com/taraco123/n/n53b662bcf8fc
(これはPDF生成版)

function myFunction() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const key = ss.getId(); const sheets = ss.getSheets(); const token = ScriptApp.getOAuthToken(); const folder = DriveApp.getFolderById("★フォルダIDを記載"); sheets.forEach(function(sheet){ const gid = sheet.getSheetId(); const url = "https://docs.google.com/spreadsheets/d/" + key + "/export?gid=" + gid + "&exportFormat=xlsx”; const options = { headers:{"Authorization":"Bearer " + token} } const response = UrlFetchApp.fetch(url,options); const blob = response.getBlob(); blob.setName(sheet.getName()); folder.createFile(blob); }); }

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

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

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

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

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

k.a_teratail

2022/08/04 13:08

> const url = "https://docs.google.com/spreadsheets/d/" + key + "/export?gid=" + gid + "&exportFormat=xlsx; こちら、末尾に「"」が無いのと > } 不要な閉じカッコで 構文エラーになりますが、質問者様の方では問題無く実行できているのでしょうか?
shirogohan

2022/08/05 06:00

「"」は記載漏れでした。失礼しました。不要な閉じカッコはどちらになりますでしょうか…?
k.a_teratail

2022/08/05 06:44

コードに関数名を追加したので、不要な閉じカッコについては削除する必要はありません。
k.a_teratail

2022/08/05 06:45

ちなみにまだエラーは出ていました。 > "&exportFormat=xlsx” 最後が「"」ではないので構文エラーになっていました。
guest

回答1

0

ベストアンサー

こちらのサイトのコードを参考にしてみてはどうでしょうか?
https://www.ka-net.org/blog/?p=11966

gs

1// blob.setName(sheet.getName()); 2blob.setName(sheet.getName() + ".xlsx");

実施前

Googleドライブのフォルダ
イメージ説明

スプレッドシートの各シート

シート85シート50シート53
イメージ説明イメージ説明イメージ説明

コード実行

実行結果
イメージ説明

実施後確認

Googleドライブのフォルダ
イメージ説明

追加実施前

Googleドライブのフォルダ
イメージ説明

スプレッドシートの各シート

QUERY関数IMPORTRANGE関数QUERY+IMPORTRANGE関数
イメージ説明イメージ説明イメージ説明

追加実施

実行結果
イメージ説明

追加実施後

Googleドライブのフォルダ
イメージ説明

投稿2022/08/04 13:18

編集2022/08/05 12:07
k.a_teratail

総合スコア845

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

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

shirogohan

2022/08/05 06:04

以前こちらのサイトも参照してみたのですが、初心者の為こちらの方の書くコードがあまりよく理解できず… 記載したサイトでは解説もあり+今回の目的であるシートごとの出力が出来ると思い参照した次第です。 その記載コード部分もそのように修正してみたのですが、やはりエクセルファイルではなく、HTMLファイルが出力されてしまいました…
k.a_teratail

2022/08/05 06:47

blob.setName(sheet.getName()); を blob.setName(sheet.getName() + ".xlsx"); に書き換えてもHTMLファイルが出力されますか?
k.a_teratail

2022/08/05 06:57

こちらで実施した結果を追記しました。 実現したい結果になっているか、ご確認の方、よろしくお願いします。
shirogohan

2022/08/05 09:06

ご丁寧に本当にありがとうございます!これがまさにやりたいことなのですが、blob.setName(sheet.getName() + ".xlsx");にしても変わらずエクセルファイルではなく、HTMLファイルが出力されてしまいました…。シートが15枚ほどあるのが原因でしょうか( ; ; )ちなみにHTMLファイルにはよくわからないコード?文字の羅列が入力されています…
k.a_teratail

2022/08/05 09:35

> シートが15枚ほどあるのが こちらでも15枚で試しましたが、xlsx形式で問題なく出力されました。 もしかすると、スプレッドシートの内容が関係あるのではないでしょうか? 可能であれば、どのような内容か、質問に追記していただきたいです。
shirogohan

2022/08/05 10:21

QUERY関数とIMPORTRANGE関数を使用して、他スプレッドシートの記載内容を転記しています。まさにこれが原因でしょうか…!?
k.a_teratail

2022/08/05 12:10

> QUERY関数とIMPORTRANGE関数を使用して こちらでもQUERY、IMPORTRANGE関数を使用しましたが、xlsx形式で問題なく出力されました。 コードの実行方法について、どのような方法で実行していますか? ・Apps Scriptの画面から関数を選択し「実行」をクリック ・デプロイしたURLにアクセスしてから実行 ・スプレッドシートにボタンを配置し、ボタンをクリックして実行 ・その他(上記以外の場合、どのように実施しているか詳しく記載してください)
shirogohan

2022/08/05 12:57

度々ご確認ありがとうございます( ; ; )それではSpreadSheetの内容は関係なさそうですね。 コードの実行は ・Apps Scriptの画面から関数を選択し「実行」をクリック しています。
k.a_teratail

2022/08/06 02:22

こちらと同じ実行方法なので、なので問題なさそうですね。 原因が不明なため 以下、3つのご確認と結果を教えていただきたいです。 ■1つ目 コード内に、sleep処理が入ってないので、処理実行時に429エラーが発生するかと思います。 なので、「sheets.forEach」内のどこでも良いので Utilities.sleep(10000); を記載して、実行してみてください。 ■2つ目 新たなスプレッドシートを作成し 作成したスプレッドシート専用の「Apps Script」でコードを記載し実施 ※シートは1つのみでA1セルに何でも良いので、テキストを入力 ■3つ目 どのシートが問題なのか不明なため、シート1つ1つを指定して実施してみる const sheets = [ss.getSheetByName("シート名")];
shirogohan

2022/08/09 02:47

一度全てコード打ち直したところ、無事にエクセル出力できました。誤字があったのかもしれません。ご丁寧に教えてくださり、本当に感謝しています。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問