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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

3174閲覧

GASでローカル上のCSVを取得→Showを呼び出す権限がありません(エラー)

whitedoragon

総合スコア12

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/06/30 09:49

GASでローカル上のCSVを取得するために、別サイトのコードを参照・記述しました。

コードは数日のうちは動いていたのですが、ある日突然実行した瞬間に
「showを呼び出す権限がありません」とエラーが出て止まってしまいました。

「spreadsheetObj.show(app);」の箇所です。

ここをどのように直したらよいかわからなく、今回ご質問させていただきました。

「showを呼び出す権限」というのは、権限付与のために新たなコードを
追加するのでしょうか。
それともshowに代わる何か別のコードを使えばよいのでしょうか。

また
「var app = UiApp.createApplication().setTitle(titleStr);」の中に
使用されておりますUiAppのサポートが終了したことも関係しているのでしょうか。

UiApp代わるコードを入れたりはしたのですが
やはり最終的には「showを呼び出す権限がありません」とエラーが出てしまいます。

ご教示いただけますと助かります。
宜しくお願いします。

【importCsv.gs】

var importCsv = {   fileToTextData: function(fileBlob, stringCode){ "use strict"; var readData = null; // 文字コード指定読み込みgetDataAsString readData = fileBlob.getDataAsString(stringCode); if(!readData){ Logger.log("ERROR:データがありません"); return null; } return readData; }, writeSheet: function(spreadsheetObj, sheetObj, readData, startRow, startColumn){ "use strict"; var csvData = readData.split('\n'); // 行単位分割 var csvSplit = csvData[0].split(','); // 1行目をカンマ単位で分割 var maxColumn = csvSplit.length; // 列数 var maxRow = csvData.length; // 行数 var i, j, iLength, jLength; var logStr = ""; var lineWriteArray = []; var srcRowArray = null; var range = null; var PROGRESS_BODER = 250; // 進捗表示用 sheetObj.clear(); // シートの中身を全クリア utilities.expansionSheetSize(sheetObj, maxColumn + (startColumn-1), maxRow + (startRow-1)); iLength = csvData.length; for (i = 0; i < iLength; i++) { // 1行文字列を区切り分割して配列化 srcRowArray = utilities.csvSplit(csvData[i]); // 区切った配列を列データとして収集 jLength = srcRowArray.length; for (j = 0; j < jLength; j++) { lineWriteArray.push(srcRowArray[j]); } // setValuesのセル数限界が251?らしいので、超えない程度で(1行単位で)書き込む // [lineWriteArray] → setValuesは二次元配列受付のため range = sheetObj.getRange(startRow+i, startColumn, 1, lineWriteArray.length); range.setValues( [lineWriteArray] ); lineWriteArray = []; // 進捗表示 if( 0 === (i%PROGRESS_BODER) ){ logStr = " progress " + i + " / " + iLength; Logger.log(logStr); spreadsheetObj.toast(logStr); } } return true; },      showUiDialog: function (spreadsheetObj, titleStr, descriptionStr, buttonStr) { "use strict"; var app = UiApp.createApplication().setTitle(titleStr); var form = app.createFormPanel().setId('frm').setEncoding('multipart/form-data'); var formContent = app.createVerticalPanel(); var label1 = app.createLabel(" "); var label2 = app.createLabel(descriptionStr); var file = app.createFileUpload().setName('csvFileName'); var button = app.createSubmitButton(buttonStr); form.add(formContent); formContent.add(label1); formContent.add(label2); formContent.add(file); formContent.add(button); app.add(form); spreadsheetObj.show(app); return true; }, run: function (spreadSheetObj, fileBlob, stringCode, sheetNameStr, startRow, startColumn) {"use strict"; var readTextData = null; if( !fileBlob ){ var FILE_NAME = "csv4.txt"; var forceOnMemory = false; // シート書き込み強制OFFか? readTextData = this.getTextFile(FILE_NAME); } else{ // バイナリ → テキスト変換 readTextData = this.fileToTextData(fileBlob, stringCode); if (!readTextData) return false; } // 対象シートを開く var sheetObj = utilities.openSheet(spreadSheetObj, sheetNameStr); if (!sheetObj) return false; // 対象シートに対象カンマ区切りテキストを1セルずつ書き込む return this.writeSheet(spreadSheetObj, sheetObj, readTextData, startRow, startColumn); } };

【main.gs】

function onOpen() { "use strict"; var spreadsheetObj = SpreadsheetApp.getActiveSpreadsheet(); var menuList = []; menuList.push({ name : "CSVファイルインポート", functionName : "importCSV" }); spreadsheetObj.addMenu("csvインポート", menuList); } function importCSV() { "use strict"; var spreadsheetObj = SpreadsheetApp.getActiveSpreadsheet(); var titleStr = "csvファイルインポート"; var descriptionStr = "インポートするファイルを選んで下さい"; var buttonStr = "インポート実行"; importCsv.showUiDialog(spreadsheetObj, titleStr, descriptionStr, buttonStr); } function doPost(e) { "use strict"; var spreadsheetObj = SpreadsheetApp.getActiveSpreadsheet(); var startRow = 1; // 書き込み開始行数(1 origin) var startColumn = 1; // 書き込み開始列数(1 origin) var STRING_CODE = "Shift_JIS"; // CSV文字コード指定 var EXPORT_SHEET_NAME = "export"; // 出力シート名 var logStr = ""; var fileBlob = e.parameter.csvFileName; var app = UiApp.getActiveApplication(); importCsv.run(spreadsheetObj, fileBlob, STRING_CODE, EXPORT_SHEET_NAME, startRow, startColumn); logStr = "import finish"; Logger.log(logStr); spreadsheetObj.toast(logStr); return app.close(); } function test() { "use strict"; var spreadsheetObj = SpreadsheetApp.getActiveSpreadsheet(); var startRow = 1; // 書き込み開始行数 var startColumn = 1; // 書き込み開始列数 var STRING_CODE = "Shift_JIS"; // CSV文字コード指定 var EXPORT_SHEET_NAME = "export"; // 出力シート名 importCsv.run(spreadsheetObj, null, STRING_CODE, EXPORT_SHEET_NAME, startRow, startColumn); }

【utilities.gs】

var utilities = { expansionSheetSize: function (sheetObj, sizeColumn, sizeRow) { "use strict";      var maxColumn = sheetObj.getMaxColumns(); var maxRow = sheetObj.getMaxRows(); var addColumnNum = sizeColumn - maxColumn; var addRowNum = sizeRow - maxRow; if (0 < addColumnNum) { sheetObj.insertColumns(maxColumn, addColumnNum); // 列拡張 } if (0 < addRowNum) { sheetObj.insertRows(maxRow, addRowNum); // 行拡張 } }, openSheet: function (spreadSheetObj, sheetNameStr) { "use strict"; var sheetObj = spreadSheetObj.getSheetByName(sheetNameStr); if (null === sheetObj) { Logger.log("対象シートがシートが見つかりません [" + sheetNameStr + "]"); var temp = spreadSheetObj.getSheetByName("fl_template"); sheetObj = spreadSheetObj.insertSheet(sheetNameStr, 1, { template : temp }); if (null === sheetObj) Logger.log("エラー:新規にシート追加できませんでした [" + sheetNameStr + "]"); else Logger.log("新規にシートを追加しました [" + sheetNameStr + "]"); } return sheetObj; }, /** replaceAll: function(expression, src, dest){ "use strict"; /* 変数宣言強制 */ return expression.split(src).join(dest); }, csvSplit: function(lineStr) { "use strict"; var result = null; var tmpArray = null; var i = 0; var backup = lineStr; tmpArray = lineStr.split('"'); if( 1 < tmpArray.length ){ lineStr = ""; tmpArray[1] = this.replaceAll(tmpArray[1], ",", " "); for(i = 0; i < tmpArray.length; i++) lineStr += tmpArray[i]; } result = lineStr.split(','); return result; }, getTextFile: function (readFileName) { "use strict"; var files = null; var fileBlob = null; var contents = null; var i = 0; var fileName = ""; files = DocsList.getFiles(); for(i = 0; i < files.length; i++){ fileName = files[i].getName(); if(readFileName === fileName){ fileBlob = files[i].getBlob(); contents = fileBlob.getDataAsString("Shift_JIS"); return contents; } } return null; } };

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

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

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

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

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

papinianus

2018/06/30 13:48

確認しましたが動作しました。のでUiAppのサポート切れは直接の原因ではないでしょう(もともと動いていたようですし)。スプレッドシートを共有したり、他のユーザとして操作しているということはないですか?
whitedoragon

2018/06/30 14:03

ありがとうございます。スプレッドシートは共有はしていないです。ちなみに新たにスプレッドシートを作成してコードを書き直しましたが、やはり同じエラーが出てしまいます。。。
guest

回答1

0

自己解決

別のサイトで調べましたところ「~呼び出す権限がない」のエラーは単独で実行する分には
エラーが出ないとありましたので、同じプロジェクト内に下記コードのスクリプトを作成・
タグ実行しましたらインポートすることができました。

ただ、なぜそれで実行できるようになったのか、まだわからない部分がありますので
引き続き調べていきたいと思います。ありがとうございました。

【修復コード.gs】

function myFunction() {  var spreadsheetObj = SpreadsheetApp.getActiveSpreadsheet();   var titleStr = "csvファイルインポート"; var descriptionStr = "インポートするファイルを選んで下さい"; var buttonStr = "インポート実行"; importCsv.showUiDialog(spreadsheetObj, titleStr, descriptionStr, buttonStr); var app = UiApp.createApplication().setTitle(titleStr); var form = app.createFormPanel().setId('frm').setEncoding('multipart/form-data'); var formContent = app.createVerticalPanel(); var label1 = app.createLabel(" "); var label2 = app.createLabel(descriptionStr); var file = app.createFileUpload().setName('csvFileName'); var button = app.createSubmitButton(buttonStr); form.add(formContent); formContent.add(label1); formContent.add(label2); formContent.add(file); formContent.add(button); app.add(form); spreadsheetObj.show(app); return true; }

投稿2018/06/30 15:37

whitedoragon

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問