06_エクセル風外観

【06_エクセル風外観】「JExcel」でエクセル風にする〔解説編 Vol.3〕エクセル風画面のデータをスプレッドシートに反映させる

記事概要

この記事は、GASによる以下のエクセル風外観実装アプリの解説記事になります。今回はJExcel関数にスプレッドシート上のデータを引き渡す方法の解説です。

先回までの記事(JExcelをGASのテンプレートに実装する方法の解説)は以下を参照ください。

クライアント側(エクセル風画面)の編集結果をサーバー側(スクリプト)に引き渡す

エクセル風画面で編集が済んだら、以下の様な結果をスプレッドシートに書き込みたいですね。このためには、まずエクセル風画面内のデータを配列に移してやる必要があります。

ところが、なかなかネットでプログラム例を見つけられませんでしたので、やや垢抜けないやりかたですが、ループを回して1要素ずつセルの値を配列変数に代入する方法を取りました。

まずテンプレートでのプログラムの説明です。

コードです。

<script>
function doWriteSheet(myRows, myCols){

//テーブルの行数、列数の宣言
var nRow = myRows;
var nCol = myCols;

//テーブルの行数だけ要素のある配列を宣言
var myCells = new Array(nRow+1);

//テーブルの列数だけ子要素を宣言
for (var iRow = 0; iRow < nRow+2; iRow++){
    myCells[iRow] = new Array(nCol+1);
}

//各行でループ
for (var iRow = 0 ; iRow < nRow; iRow++) {

//各列でループ
  for (var iCol=0 ; iCol < nCol; iCol++) {
//iRow行目のiCol列目のセルのテキスト値を取得 //getValueFromCoordsは、列、行の順の指定なので注意
myCells[iRow+1][iCol+1] = myExcelBody.getValueFromCoords(iCol,iRow);
}
}
//テーブルのセルの値をGASのSetSheet 関数に渡す
google.script.run.withSuccessHandler(onSuccess).SetSheet(myCells, nRow, nCol);
}
</script>


<!—- ボタンの表記—->
button onclick=”doWriteSheet(<?=myRows ?>, <?=myCols ?>)”>書込み</button>

前段では<script>~</script>タグの中で、doWriteSheet という関数を定義して、この中でエクセル風の画面からデータを配列に入れ込んでいます。

肝心なところは以下のたった一行です。

myCells[iRow+1][iCol+1] = myExcelBody.getValueFromCoords(iCol,iRow);

myCells はユーザーが定義した配列です。ここに、getValueFromCoords というライブラリ関数を使ってセルの値を渡しています。

注意すべき点は、この関数のセル番地の指定の方法が 列x行 の順であることです。エクセルのVBAマクロなどでの指定は 行x列 の順なので、それとは逆になります。なお、myExcelBody はエクセル風画面のオブジェクトです。

不思議な事に(?)、myExcelBody に値を入れ込むときにはテーブルを介するなど苦し紛れの手法が必要だったのですが、値を取り出す時にはこうした迂回措置は不要でした。

終わりの方では、google.script.run.withSuccessHandler(onSuccess) 関数に、スクリプト側での以下の関数を設定して、そこに myCells を引き渡しています。

SetSheet(myCells, nRow, nCol);

ここまでの内容は、JExcelからのデータの取得部分以外は以下にも詳しく解説していますので、参考にしてください。

ここからから先、スクリプト側でスプレッドシートに値を書き込む方法も上の記事を参照ください。コードはスクリプト側で実装します。

 

最後に、テンプレート上に以下の様なボタン要素を定義して、ボタンのクリックによりこの関数が実行できる様にしておきます。

button onclick=”doWriteSheet“・・・>書込み</button>

 

実行画面ですが、以下の様なWEB画面の結果が・・・

スプレッドシートに以下の様に反映されます。

 

次回の記事では、これまでのコードの紹介を致します。