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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

キャッシュ

キャッシュはドキュメントやデータを一時的に保管するもので、アクセス処理時間を短くするために使用されます。

JavaScript

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

Q&A

解決済

1回答

766閲覧

GAS(JavaScript)環境でシート情報のメモ化関数を統一したい

2477_g

総合スコア1

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

キャッシュ

キャッシュはドキュメントやデータを一時的に保管するもので、アクセス処理時間を短くするために使用されます。

JavaScript

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

0グッド

1クリップ

投稿2021/12/22 06:49

編集2021/12/22 07:55

前提・実現したいこと

GASの実行時間の関係上、シート呼び出し回数を減らしたい→メモ化
Google App Script(JavaScript)で、シート情報のメモ化を行う関数を一つにまとめたい

以下よりいいアイデアがないか、探しています

発生している問題・エラーメッセージ

メモ化までは実装できたが、関数をまとめるところができていない

該当のソースコード

// シートのメモ化 ※nはシートのIndex番号
function mySheetMemo(){
if(!mySheetMemo.memos){
memoSheetMemo.memos = SpreadsheetApp.getActive().getSheets()[n];
}
return mySheetMemo.memos;
}

現在、これを複数の関数として生成しています
(function mySheetMemo1,mySheetMemo2,mySheetMemo3...)

シート番号を引数として渡すことで関数を統一できないか知りたいです
function mySheetMemo(n){}

考えたこと

グローバル変数 global_sheetmemo[]を生成し、配列内にシートメモ情報を格納する
初回呼び出しでシート数を取得し、mySheetMemoのif判定に使用する
※存在しないシート番号は処理できないように防止
onOpen(){
let sheet_max = SpreadsheetApp.getActive().getNumSheets();
global_sheetmemo = Array(sheet_max);
}

補足情報(FW/ツールのバージョンなど)

GAS環境でHTMLファイルと通信し、サイドバーで視覚的に操作を行うため、呼び出し回数が増えることが予想される
[経験]
JavaScript(GAS)3ヵ月
C++(C言語)12ヵ月

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こういうことでしょうか?

js

1const memoSheetMemo = { memos: {} }; 2 3function mySheetMemo(n) { 4 if (!memoSheetMemo.memos.hasOwnProperty(n)) { 5 console.log("Got sheet No." + n); 6 memoSheetMemo.memos[n] = SpreadsheetApp.getActive().getSheets()[n]; 7 } 8 return memoSheetMemo.memos[n]; 9}

コード使用例:
(あらかじめスプレッドシート内にシートを10枚作成済みであると仮定します)

js

1function main() { 2 for (let i = 0; i < 10; i++) { 3 let m = mySheetMemo(i); 4 console.log(m.getName()); 5 } 6 7 for (let i = 0; i < 10; i++) { 8 let m = mySheetMemo(i); 9 console.log(m.getName()); 10 } 11}

投稿2021/12/22 13:57

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

2477_g

2021/12/22 17:05

ありがとうございます! コード見てる感じではそういうことです。 おそらく自分では半分くらい理解しました。まだやってることはなんとなく理解しても挙動が頭に追い付いてません。いじってみます。 .hasOwnPropertyと関数の連想配列に関してはもう少し調べてからこれを使ってみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問