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; } };
回答1件
あなたの回答
tips
プレビュー