Office関連

Excel Services JavaScript APIを試してみました(2)

前回の記事で、JavaScriptコードを貼り付けてExcelワークブックをWebページに埋め込むところまで確認しました。
今回はいよいよ貼り付けたブックをJavaScriptで操作してみます。

まずは習うより慣れろということで、サンプルページ「Read formatted value from selected cell」のコードをほぼそのまま使ってみます。

<input type="button" value="クリックしてください。" onclick="execute();"></input>
<script type="text/javascript" src="http://r.office.microsoft.com/r/rlidExcelWLJS?v=1&kip=1"></script>
<script type="text/javascript">
    // run the Excel load handler on page load
    if (window.attachEvent) {
        window.attachEvent("onload", loadEwaOnPageLoad);
    } else {
        window.addEventListener("DOMContentLoaded", loadEwaOnPageLoad, false);
    }

    function loadEwaOnPageLoad() {
        var fileToken = "SD92A165759188B352!264/-7880906317294423214/";
        var props = {
            item: "'Sheet1'!A1:C3",
            uiOptions: {
                showDownloadButton: false,
                showGridlines: false,
                selectedCell: "'Sheet1'!B2",
                showParametersTaskPane: false
            },
            interactivityOptions: {
                allowTypingAndFormulaEntry: false,
                allowParameterModification: false,
                allowSorting: false,
                allowFiltering: false,
                allowPivotTableInteractivity: false
            }
        };
        Ewa.EwaControl.loadEwaAsync(fileToken, "myExcelDiv", props, onEwaLoaded);
    }

    function onEwaLoaded() {
        //document.getElementById("loadingdiv").style.display = "none";
    }
    // This sample gets the value in the highlighted cell. 
    // Try clicking on different cells then running the sample.

    function execute() {
        // Get unformatted range values (getValuesAsync(1,...) where 1 = Ewa.ValuesFormat.Formatted)
        ewa.getActiveWorkbook().getActiveCell().getValuesAsync(1, getRangeValues, null);
    }

    function getRangeValues(asyncResult) {
        // Get the value from asyncResult if the asynchronous operation was successful.
        if (asyncResult.getCode() == 0) {
            // Get the value in active cell (located at row 0, column 0 of the
            // range which consists of a single cell (the "active cell")).
            alert("Result: " + asyncResult.getReturnValue()[0][0]);
        } else {
            alert("Operation failed with error message " + asyncResult.getDescription() + ".");
        }
    }
</script>
<div id="myExcelDiv" style="width: 300px; height: 100px"></div>

・・・「クリックしてください。」ボタンをクリックしても動作しません。
やはり最初から上手くはいかないですね・・・。

Read formatted value from selected cell」のサンプルは、ボタンをクリック(executeを実行)するとアクティブセルの値をalertで表示する、というものですが、上記コードはどうやらexecute関数が上手く動作していないようです。
そこでexecute関数の中身を見てみると次のようになっています。

ewa.getActiveWorkbook().getActiveCell().getValuesAsync(1, getRangeValues, null);

これを見ると、

1. ewa(オブジェクト?)のgetActiveWorkbookメソッドでアクティブなワークブックを取得
2. 1.で取得したワークブックオブジェクトのgetActiveCellメソッドでアクティブなセルを取得
3. 2.で取得したセル(Range?)オブジェクトのgetValuesAsyncメソッドでセルの値を取得

というような動作をするのではないかと推測できますが、そもそもこの「ewa」というのはどこから来ているのか?
サンプルコード中にはそれっぽい記述はありません。
仕方が無いので「getActiveWorkbook」メソッドを手がかりにMSDNのリファレンスを調べてみると、ちゃんと記述がありました。

function ewaApplicationReady()
{
    // Get a reference to the EWA.
    ewa = Ewa.EwaControl.getInstances().getItem(0);
    // Display the Workbook path.
    alert(ewa.getActiveWorkbook().getWorkbookPath());
}

Ewa.EwaControl.getActiveWorkbook()」より

ewa = Ewa.EwaControl.getInstances().getItem(0);」、この部分でEwa.EwaControlオブジェクトを取得(EWA(Excel Web Access) Web パーツへの参照を取得)しておかないといけなかったわけですね。
それでは改めてコードを貼り付け、「クリックしてください。」ボタンをクリックしてみます。

<input type="button" value="クリックしてください。" onclick="execute();"></input>
<script type="text/javascript" src="http://r.office.microsoft.com/r/rlidExcelWLJS?v=1&kip=1"></script>
<script type="text/javascript">
    // run the Excel load handler on page load
    if (window.attachEvent) {
        window.attachEvent("onload", loadEwaOnPageLoad);
    } else {
        window.addEventListener("DOMContentLoaded", loadEwaOnPageLoad, false);
    }

    function loadEwaOnPageLoad() {
        var fileToken = "SD92A165759188B352!264/-7880906317294423214/";
        var props = {
            item: "'Sheet1'!A1:C3",
            uiOptions: {
                showDownloadButton: false,
                showGridlines: false,
                selectedCell: "'Sheet1'!B2",
                showParametersTaskPane: false
            },
            interactivityOptions: {
                allowTypingAndFormulaEntry: false,
                allowParameterModification: false,
                allowSorting: false,
                allowFiltering: false,
                allowPivotTableInteractivity: false
            }
        };
        Ewa.EwaControl.loadEwaAsync(fileToken, "myExcelDiv", props, onEwaLoaded);
    }

    function onEwaLoaded() {
        //document.getElementById("loadingdiv").style.display = "none";
    }
    // This sample gets the value in the highlighted cell. 
    // Try clicking on different cells then running the sample.

    function execute() {
        ewa = Ewa.EwaControl.getInstances().getItem(0);
        // Get unformatted range values (getValuesAsync(1,...) where 1 = Ewa.ValuesFormat.Formatted)
        ewa.getActiveWorkbook().getActiveCell().getValuesAsync(1, getRangeValues, null);
    }

    function getRangeValues(asyncResult) {
        // Get the value from asyncResult if the asynchronous operation was successful.
        if (asyncResult.getCode() == 0) {
            // Get the value in active cell (located at row 0, column 0 of the
            // range which consists of a single cell (the "active cell")).
            alert("Result: " + asyncResult.getReturnValue()[0][0]);
        } else {
            alert("Operation failed with error message " + asyncResult.getDescription() + ".");
        }
    }
</script>
<div id="myExcelDiv" style="width: 300px; height: 100px"></div>

alertでアクティブセルの値「Hello, world!」が表示され、今度は上手くいきました。
これで何となくJavaScriptによるブック操作が掴めてきました。



Excel Services JavaScript APIを試してみました(1)前のページ

[Excel Services ECMAScript]ActiveWorkbookのパスを取得する。次のページ

関連記事

  1. Office関連

    名前空間を指定してXPathで要素を取得するVBAマクロ

    Tech Communityに、“XPathで名前空間プレフィックス付…

  2. Office関連

    Outlookを使ってGmail送信を行うVBAマクロ

    下記G Suite アップデート ブログにある通り、今年の6月には“安…

  3. Office関連

    PowerShellからNetOfficeを使ってExcelを操作する方法

    先日、Excel MVPの伊藤さんがPowerShellからExcel…

  4. Office関連

    Google スライドで新規プレゼンテーションを作成するVBAマクロ

    ここ数日PowerPointのマクロに加え、Google Apps S…

  5. Office関連

    OneNoteの指定したセクションをページごとに指定した形式で出力するマクロ

    今回はOneNoteの指定したセクションをページごとに指定した形式で出…

コメント

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

PAGE TOP