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

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

ただいまの
回答率

90.50%

  • JavaScript

    16440questions

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

  • HTML

    8986questions

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

  • Google Apps Script

    847questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 332

whitedoragon

score 4

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;
    }



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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • papinianus

    2018/06/30 22:48

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

    キャンセル

  • whitedoragon

    2018/06/30 23:03

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

    キャンセル

回答 1

check解決した方法

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;



}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16440questions

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

  • HTML

    8986questions

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

  • Google Apps Script

    847questions

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