2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【GAS】セルのデータを2次元配列でプロパティに格納して取り出す方法

Last updated at Posted at 2024-01-27

2次元配列をプロパティにセットする方法

備忘用に残しておきます。
プロジェクトのプロパティにデータを格納できる以下の記述は、
二次元配列を格納すると「[Ljava.lang.Object;abcdef10」のような形に格納されてしまい、
取り出しても使うことができません。

プロパティに値をセット.gs
ScriptProperties.setProperty(key,value);

2次元配列を格納する場合はJSON.stringifyを使用しましょう。

プロパティに値をセット.gs
ScriptProperties.setProperty(key,JSON.stringify(value)));

画像のように2次元配列の形で格納されます。
image.png

2次元配列をプロパティから取り出す方法

プロパティから取り出すときも同様に、ひと手間加える必要があります。
JSON.parse()を使用しましょう。(key:testValues)

プロパティから値を取得.gs
getTestValues = JSON.parse(ScriptProperties.getProperty("testValues"));

サンプルコード

■仕様

テストシートのB1に最終更新日が入っています。
メインメソッドを初回起動時に、この最終更新日とテストシートの値をそれぞれプロパティにセットします。
[key]updateDate:[value]テストシートの最終更新日(B1セル)
[key]testValues:[value]テストシートの値

[key]updateDateの値が、セルの最終更新日と日時(秒数まで)が同じ場合は、
プロパティの[key]testValuesをメインシートに表示します。

[key]updateDateの値が、セルの最終更新日と日時(秒数まで)が異なる場合は、
再度、最終更新日とテストシートの値をそれぞれプロパティにセットし、
メインシートには現在のテストシートの値を表示します。(プロパティから復元しません)

■コード

コード.gs
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秒は早くなります。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?