2次元配列をプロパティにセットする方法
備忘用に残しておきます。
プロジェクトのプロパティにデータを格納できる以下の記述は、
二次元配列を格納すると「[Ljava.lang.Object;abcdef10」のような形に格納されてしまい、
取り出しても使うことができません。
ScriptProperties.setProperty(key,value);
2次元配列を格納する場合はJSON.stringifyを使用しましょう。
ScriptProperties.setProperty(key,JSON.stringify(value)));
2次元配列をプロパティから取り出す方法
プロパティから取り出すときも同様に、ひと手間加える必要があります。
JSON.parse()を使用しましょう。(key:testValues)
getTestValues = JSON.parse(ScriptProperties.getProperty("testValues"));
サンプルコード
■仕様
テストシートのB1に最終更新日が入っています。
メインメソッドを初回起動時に、この最終更新日とテストシートの値をそれぞれプロパティにセットします。
[key]updateDate:[value]テストシートの最終更新日(B1セル)
[key]testValues:[value]テストシートの値
[key]updateDateの値が、セルの最終更新日と日時(秒数まで)が同じ場合は、
プロパティの[key]testValuesをメインシートに表示します。
[key]updateDateの値が、セルの最終更新日と日時(秒数まで)が異なる場合は、
再度、最終更新日とテストシートの値をそれぞれプロパティにセットし、
メインシートには現在のテストシートの値を表示します。(プロパティから復元しません)
■コード
const SPREAD_SHEET = SpreadsheetApp.getActiveSpreadsheet();
const SHEET_NAME_MAIN = "メイン";
const SHEET_NAME_TEST = "テスト";
/**
* isEqualUpdateDate()がtrueの場合、
* スクリプトプロパティのkey:testValuesのvalueを取得する。
* falseの場合、現在のテストシートの値を取得する。
* 出力先はメインシートのA1以下。
*/
function executeService() {
//スクリプトプロパティに設定している更新日と、シート状の更新日が一致するか確認する。
if (isEqualUpdateDate()) {
try {
testValues = JSON.parse(ScriptProperties.getProperty("testValues"));
} catch (e) {
//もしも何らかの理由でエラーとなった場合は、現時点のテストシートの値をスクリプトプロパティに再設定する。
ScriptProperties.setProperty("testValues",JSON.stringify(getTestValues()));
Logger.log(e);
}
} else {
testValues = getTestValues();
}
//メインシートに出力する
getSheetObj(SHEET_NAME_MAIN).getRange(1,1,testValues.length,testValues[0].length).setValues(testValues);
}
/**
* スクリプトプロパティのupdateDateと、
* B1セルのマスタ更新日の値を比較し、一致する場合はtrueを返す。
* 異なる場合はスクリプトプロパティにマスタ更新日とテストシートの値をセットしてfalseを返す。
*/
function isEqualUpdateDate() {
const updateDate = getSheetObj(SHEET_NAME_TEST).getRange("B1").getValue();
const getUpdateProperty = ScriptProperties.getProperty("updateDate");
//getValue()は書式なしの場合string。getProperty()はデフォルトでstringになる。
//比較できるように、形式をそろえる。
if (formatDate(new Date(updateDate)) == formatDate(new Date(getUpdateProperty))) {
return true;
}
//key:updateDateにテストシートB1セルの値をセットする。
ScriptProperties.setProperty("updateDate", updateDate);
//key:testValuesにテストシートの値を2次元配列の形でセットする。(そのままセットすると二次元配列にならないため注意)
ScriptProperties.setProperty("testValues",JSON.stringify(getTestValues()));
return false;
}
/**
* 日付をyyyy/MM/dd hh:mm:ssにする
*/
function formatDate(date) {
return Utilities.formatDate(date, "JST", "yyyy/MM/dd hh:mm:ss");
}
/**
* テストシートの値をすべて取得する
*/
function getTestValues() {
return getSheetObj(SHEET_NAME_TEST).getDataRange().getValues();
}
/**
* シートオブジェクト取得
*/
function getSheetObj(sheetName) {
return SPREAD_SHEET.getSheetByName(sheetName);
}
プロジェクトのスクリプトプロパティを確認してください。
実行時間も、都度テストシートの値を取得するよりも0.5~1秒は早くなります。