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

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

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

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

Google Apps Script

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

Q&A

解決済

2回答

7065閲覧

GoogleDrive上でxlsxデータをスプレッドシートに変換し、変換後のファイルのURLを取得したい

aomatsu_

総合スコア18

Google スプレッドシート

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

Google Apps Script

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

0グッド

1クリップ

投稿2021/05/02 13:03

編集2021/05/02 13:21

前提・実現したいこと

Google Drive上にアップロード済の.xlsxファイルを既存のスプレッドシートにコピーするため、
いったんそのxlsxファイルをスプレッドシートに変換した上で、GASで操作しようとしています。

変換まではできたのですが、変換後のファイルを取得することができません。

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

Exception: Invalid argument

該当のソースコード

GAS

1function test(){ 2 //ファイルをスプレッドシートに変換する 3 4 //元のfileを指定 5 var fileID = "XXX"; 6 //格納folderを指定 7 var folderID = "***"; 8 //タイトルを指定 9 var filename = "※テスト用 変換後データ"; 10 11 //fileの中身を取得 12 var filecontent = DriveApp.getFileById(fileID).getBlob(); 13 //オプションを設定 14 var option = { 15 "mimeType": "MimeType.GOOGLE_SHEET", 16 "parents": [{id: folderID}], 17 "title": filename 18 }; 19 //insertで変換 20 var cv_sheet = Drive.Files.insert(option, filecontent); 21 //変換後データのURLを取得 22 var cv_sheet_url = cv_sheet.getUrl(); 23 24 console.log(cv_sheet_url); 25}

試したこと

・フォルダを確認したところ「テスト用変換後データ」はちゃんとスプレッドシートの形でコピー作成されていました。

insertメソッドの戻り値の型はFileクラスとのことなので、getUrlメソッドが使えると思ったのですが・・・何がおかしいのでしょうか。

ご意見・コメントよろしくお願いします。

補足情報

こちらの記事こちらの記事では

GAS

1 file = Drive.Files.insert(file, blob, option); 2 var doc = DocumentApp.openByUrl(file.embedLink); 3 var body = doc.getBody().getText(); 4 var docID = doc.getId(); 5 var docUrl = "https://docs.google.com/document/d/" + docID + "/edit";

などと、file.embedLinkを使って一旦URLを取得し、ID部分を抽出し、再度URLを生成しているように見えるのですが
同様にやっても動かず、またembedLinkオブジェクトというものの使い方が検索であまり出てこず、ここでご相談するに至りました。

わかる方いらっしゃいましたら解説していただけると非常に助かります。よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/02 13:30

「変換後のファイルを取得する」とはダウンロード用のリンクを取得したいのでしょうか? それとも「GASで操作しようとしています」とのことから、単純にスプレッドシートのIDが取得できればよいのでしょうか?
aomatsu_

2021/05/03 03:22

後者です。 スプレッドシートのIDを取得して、GASでコピーやシート内での移動、セル入力などを実装しようと考えています。
guest

回答2

0

ベストアンサー

・sawaさんの書かれているように、mimeTypeの「値」は引用符を外し「MimeType.GOOGLE_SHEETS」としないと、正常にGoogleスプレッドシートに変換されません。
(「mimeType」というキー名は、引用符があってもなくてもよい)

・(スプレッドシートのIDを取得するだけでよいとのことなので)
Drive.Files.insert(option, filecontent)の戻り値であるFileオブジェクトのid属性が、スプレッドシートのIDとなっています。
あとはそのIDを利用してスプレッドシートを操作すればよいです。
(※正常にスプレッドシートが生成されている前提です。正常にスプレッドシートが生成されていない場合、正常なIDが返ってこないため、当然スプレッドシートの操作はできません)

・おそらくですが、格納先に同じファイル名のファイルが既に存在していると、生成に失敗する可能性があります。

下記は、対象のスプレッドシートのID及び、アクティブシートのA1:G10の内容をログに記録する例です。

GAS

1function myFunction() { 2 //ファイルをスプレッドシートに変換する 3 4 //元のfileを指定 5 var fileID = 'XXX'; 6 7 //格納folderを指定 8 var folderID = '***'; 9 10 var filename = '※テスト用 変換後データ'; 11 12 var folderID = ssid; 13 //fileの中身を取得 14 var filecontent = DriveApp.getFileById(fileID).getBlob(); 15 //オプションを設定 16 var option = { 17 "mimeType": MimeType.GOOGLE_SHEETS, 18 "parents": [{id: folderID}], 19 "title": filename 20 }; 21 22 //insertで変換 23 var cv_sheet = Drive.Files.insert(option, filecontent); 24 25 Logger.log(cv_sheet.id); 26 27 // スプレッドシートIDを使って、スプレッドシートオブジェクトを取得 28 var ss = SpreadsheetApp.openById(cv_sheet.id); 29 30 var sheet = ss.getActiveSheet(); 31 Logger.log(sheet.getRange("A1:G10").getValues()); 32}

投稿2021/05/03 03:49

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

aomatsu_

2021/05/03 11:19

スクリプトの例までご提示いただき、ありがとうございました。 おかげ様でIDを取得後、無事狙っていた通りの動き(コピーして別のスプレッドシートにコピー、シート名変更など)ができました。
guest

0

cv_sheet はDrive APIで変換しているので、DriveAPIでIDかURLを取得してから、それを用いてGASの SpreadsheetApp や DriveApp で取得しなおす必要があります。(そのまんまGASのメソッドは使えない)

エディタで cv_sheet. と入力した時に候補として出てくる

cv_sheet.idで IDが取得できて、cv_sheet.embedLinkcv_sheet.alternateLinkでURLが取得できます。(個人的にはIDでいいと思います)

あと余談ですが、insert で使う option の書き方を確認してみてください。このままだと、スプレッドシートに変換されてなかったりしませんか?

↓ ダブルクォート不要で、MimeType.GOOGLE_SHEETS では?

var option = { mimeType: MimeType.GOOGLE_SHEETS, parents: [{id: folderID}], title: filename };

参考
https://developers.google.com/drive/api/v2/reference/files

投稿2021/05/02 13:45

編集2021/05/02 13:50
sawa

総合スコア3002

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

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

aomatsu_

2021/05/03 09:15

>cv_sheet はDrive APIで変換しているので、DriveAPIでIDかURLを取得してから、それを用いてGASの SpreadsheetApp や DriveApp で取得しなおす必要があります。 DriveAPIとGASの違いがあまりわかっていなかったです…。ありがとうございます。 >あと余談ですが、insert で使う option の書き方を確認してみてください。このままだと、スプレッドシートに変換されてなかったりしませんか? まさに変換できていませんでした。修正したところちゃんとスプレッドシートに変換できるようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問