考えたこと
-
onChange トリガーで、全てのセル関数を見て関数を再設定することを考えました。
(この前提として、onChange で関数を参照して、あるセル(仮に B1)に =getMemo("A1") とかかれていたとしても、B1 に A1 のメモをそのまま setValue すると関数が消えるので次回以降、同様の監視ができなくなります)
-
まずは関数を全セットすればいいと思いました。
このとき、onChange はどのシートを編集したかすらわからないので、全てのシートを見ないといけないことに気付きました。
-
次に、同じ関数を上書き保存しても、再計算が起こらないことに気付きました。
これは、セルから関数を消してすぐに同じ関数を書いた(編集したが同じ値にした)場合も更新がかからないので、そういう動作なのだと思います。
-
さらに、一旦、空白値を書き込み、関数を再セットしても何も起こりませんでした。
flush をしないといけないのだなと思いました。
-
flush をすると無限にローディングが繰り返されるので、見辛いですし、累積の実行時間が長くなりすぎてアカウントを ban されそうなので中断しました。
どうなっても責任とれませんが、下記に共有します。(q362999 をトリガーに設定します)
javascript
1function q362999(e) {
2 if(e.changeType !== "OTHER") return;
3 SpreadsheetApp.getActive().getSheets().forEach(s=>{
4 const funcs = s.getDataRange().getFormulas();
5 funcs.forEach((r,i)=>{
6 r.forEach((c,j) => {
7 if(!c.startsWith('=getMemo')) return;
8 s.getRange(i+1,j+1).setValue(""); // これを flush することで、変更が連鎖するが、本当にこれでずっと動いて問題ないかは分からない
9 SpreadsheetApp.flush();
10 s.getRange(i+1,j+1).setFormula(c);
11 });
12 });
13 });
14}
15function getMemo(cellInf) {
16 // 現在アクティブなスプレッドシートを取得
17 var ss = SpreadsheetApp.getActiveSpreadsheet();
18 // 現在開いているシートを取得
19 var sheet = ss.getActiveSheet();
20 // そのシートにある対象のセル位置を取得
21 var range = sheet.getRange(cellInf);
22
23 // そのセルに設定されているメモをセルごとに取得する
24 var results = range.getNotes();
25
26 //メモ内容を返却する
27 return results;
28}
ユーザがGoogleAppsに慣れていない
Gooogle Apps に慣れる必要はないと思います。よくあるパターンはエクセルになれているからスプレッドシートを採用するのではないかと思います(エクセルになれているわけではないなら、用途に応じて他のツールを探すのも一案だと思います。kintone とか notion とか)。
一方で、エクセルと違うメリット(同時に編集して互いに編集状況をどこからでも参照できる)もデメリット(関数の動作が違う)もあるので、運用の変更はあってもいいんじゃないかと。
運用でやりたいことが見えないので具体的には難しいですが、ノートを使わない(一定の書式の枠外のセルに記入する)、ノートをつけるような使いかたをする人向けには閲覧用のシートや画面を提供する(importrangeを使うなど)といった運用が考えられます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/16 23:04