見出し画像

前後日のリンクだるい問題

下記記事にコメント頂いたもののお返事が長くなりそうだったので、こちらに記載します。

毎日のリンク(手動)が面倒くさい。あと1週間分くらい表示したい

わかります〜〜〜
去年はコツコツリンクを貼ってましたが、私もめんどくさかったので、今はGASが毎日自動で、昨日と明日のDBを検索してリレーションをすると言うのを組みました。

私の現状


6/25の例だとこんな感じ。

普段表示させてる部分
前後日だけギャラリーで表示させてるもの(こっちの方がアクセスしやすい)
ギャラリー表示のフィルターはこんな感じになってるのでテンプレ適用で動的に変わります


ウィークリーログを使う

質問主さんの場合だと、1週間分を表示したいと言うことなので、私の場合だとウィークリーDBがあり、全日記DBと繋がっているのでそれを使って表示させるのが一番でしょうか。

この設定も面倒ですが…私は年末年始にセットアップの時間を設けて一年分の作業をするのでその時頑張るだけでいいので許容範囲にしています。リレーションの設定はテーブルビューだとコピーして貼り付けられるので、月、年はそんな大変じゃないんだけど、如何せんウィークリーが少し大変でしたね。

新しいプロパティ作って下記フォーミュラを用意すると、これがこの週で…とか考えなくていいのでちょっとは楽かなーと思います。
これも多分GASとかで一括で出来るんだろうなーと思うので、今年末は挑戦したいですね…。

formatDate(prop("Date"), "YYYY-WW")
「列」って名前のが上記フォーミュラが入ってるところです


ウィークリーログとリレーションが済んでる場合は、下記のように表示させるのは簡単です。

まず日記DBに、新しいプロパティを制作し、ロールアップを選択。
下記のようにウィークリーログの日記のプロパティを選択し設定します。

日記DBをリンクドデータベースで表示し、フィルターは下記のように設定。
ギャラリービューかリストビュー表示がいいと思います。カードプレビューはなしがいいですかね、ここらへんはご自由に。

これで完成です。どうでしょうか…?

プレーンテキストでっていうのは流石に難しい気がしますですね…
GASでもできるとはおもうんですが、ブロックを挿入するとページの一番下に入っちゃって、うまく位置指定ができないんですよね…。同期ブロックとか使えばいいのかなあ…。またここらへんはやってみたいです。もしくはなんかよくわかる人に教えてほしい…。

今日を基準に1週間

今回の希望とは少し違うしれませんが、日記を基準にするのではなく今日を基準に1週間と言うのも出来るので一応やり方を書いておきます。

日記DBに新しいプロパティ(フォーミュラ)を追加します。記載は下記です。

formatDate(prop("Date"), "YYYY-WW") == formatDate(now(), "YYYY-WW")

これで今日の週表示と、日記日付の週表示が一致したらチェックボックスがチェックが入りますので、それをフィルターで表示させれます。


終わり

パッと思いつく解決策はこのくらいでしょうか…。
また何か思いついたら記事にしようかと思いますー。

不明点などあればまたコメントください〜。
お困りごとが解決することを祈っております…!


おまけGAS

最後に一応前後日をリレーションするGASを書いておこうと思います。
下記の記事をお借りして、改変して制作しています。

properties.gs

// @ts-nocheck
  /**
 * 手動実行で設定する
 */
function setScriptProps() {
  let scriptProperties = PropertiesService.getScriptProperties();
  Logger.log(PropertiesService.getScriptProperties().getProperties());
  scriptProperties.deleteAllProperties();

  scriptProperties.setProperties({
    'NOTION_VERSION': '2022-02-22',
    'NOTION_TOKEN': 'ここにトークンを入れる',
    'DATEDB_ID':'日記DBのID'
  });


  // データベースとチェックボックスの列名、日付の列名を定義
  // データベースIDはデータベースのページを開き、URLから取得
  // https://www.notion.so/{userName}/{DatabaseID}?v={ViewID} となっているURLの{DatabaseID}の部分
  let checkItemList = JSON.stringify(
    [
      {
        'DATE_DATEDB_ID':'日記DBのID',
        'RELATION_PROPERTY': 'リレーションするプロパティ名',
        'DATE_PROPERTY': '日付のプロパティ名'
      }
    ]
  );

  scriptProperties.setProperties({ 'CHECK_ITEM_LIST': checkItemList });
}

中身.gs

function dailyUpdate() {
  //トリガー:毎朝5時ごろ

  const props = PropertiesService.getScriptProperties().getProperties();
  const list = JSON.parse(props['CHECK_ITEM_LIST']);
  let startDate=new Date();

  for (let i = 0; i < list.length; i++) {

    //プロパティ呼び出し
    const item = list[i];
    const dbID = item["DATE_DATEDB_ID"];

   // 今日の日記DBを名前基準で検索
    const getPayload = {
      "filter": {
          "and": [
          {
          "property": '日記DBの名前のプロパティ名',
          "title": {
              "contains" : Utilities.formatDate(startDate, "JST", "yyyy/MM/dd")
            }
          }
        ]
      }
    }
    console.log(getPayload);
    const nonCheckedItemList = getDatabaseQuery(props, dbID, getPayload);
    Utilities.sleep(1000); // 平均3回/秒のリミット回避のためスリープ


    if (nonCheckedItemList.results.length === 0) {
      Logger.log("更新対象なし")
      continue;
    }

    // 更新処理
    nonCheckedItemList.results.forEach(t => {

      const updatePayload = {
        "properties": {

            //翌日のページをリレーションする 
           "前後": {
            "relation":[
              {
                "id":getdateDbIdYesterday()
              },
              {
                "id":getdateDbIdTommorow()
              }
            ]
          },

            //当日のページをリレーションする 
           "日記": {
            "relation":[
              {
                "id":getdateDbIdToday()
              }
            ]
          },

        }
      };


       let pageId = t["id"]
      updatePage(props, pageId, updatePayload)
      Utilities.sleep(1000); // 平均3回/秒のリミット回避のためスリープ
    });
  }

}

/**
 * ページの内容を更新する
 * https://developers.notion.com/reference/patch-page
 */
function updatePage(props, pageId, payload) {
  let url = "https://api.notion.com/v1/pages/" + pageId
  let options = {
    "method" : "PATCH",
    "headers": {
      "Content-type": "application/json",
      "Authorization": "Bearer " + props.NOTION_TOKEN,
      "Notion-Version": props.NOTION_VERSION,
    },
    "muteHttpExceptions" : true,
    "payload": JSON.stringify(payload)
  };

  try {
    let res = UrlFetchApp.fetch(url, options);
    Logger.log(res);
    return JSON.parse(res);
  } catch (e) {
    Logger.log(e);
    return undefined;
  }

}

/**
 * DBから指定条件に合うものを取得する
 * https://developers.notion.com/reference/post-database-query
 */
function getDatabaseQuery(props, databaseId, payload) {
  let url = "https://api.notion.com/v1/databases/" + databaseId + "/query"
  let options = {
    "method" : "POST",
    "headers": {
      "Content-type": "application/json",
      "Authorization": "Bearer " + props.NOTION_TOKEN,
      "Notion-Version": props.NOTION_VERSION,
    },
    "payload" : JSON.stringify(payload),
    "muteHttpExceptions" : true
  }

  try {
    let res = UrlFetchApp.fetch(url, options);
    Logger.log(res);
    return JSON.parse(res);
  } catch (e) {
    Logger.log(e);
    return undefined;
  }
}

クエリ.gs

//今日の日記DB🆔
function getdateDbIdToday() {
  const props = PropertiesService.getScriptProperties().getProperties();
  const getPayload2 = {
    "filter": {
        "and": [
        {
        "property": '日記DBの名前のプロパティ名',
        "title": {
            "contains" : Utilities.formatDate(new Date(), "JST", "yyyy/MM/dd")
          }
        }
      ]
    }
  }
  return getDatabaseQuery(props, props.DATEDB_ID,getPayload2)["results"][0]["id"]

}


//明日の日記DB🆔
function getdateDbIdTommorow() {
  const props = PropertiesService.getScriptProperties().getProperties();
  const date = new Date();
  date.setDate(date.getDate() + 1); 

  const getPayload2 = {
    "filter": {
        "and": [
        {
        "property": '日記DBの名前のプロパティ名',
        "title": {
            "contains" : Utilities.formatDate(date, "JST", "yyyy/MM/dd")
          }
        }
      ]
    }
  }
  return getDatabaseQuery(props, props.DATEDB_ID,getPayload2)["results"][0]["id"]

}


//昨日の日記DB🆔
function getdateDbIdYesterday() {
  const props = PropertiesService.getScriptProperties().getProperties();
  const date = new Date();
  date.setDate(date.getDate() -1); 

  const getPayload2 = {
    "filter": {
        "and": [
        {
        "property": '日記DBの名前のプロパティ名',
        "title": {
            "contains" : Utilities.formatDate(date, "JST", "yyyy/MM/dd")
          }
        }
      ]
    }
  }
  return getDatabaseQuery(props, props.DATEDB_ID,getPayload2)["results"][0]["id"]

}

とりあえず最初にproperties.gsを一度だけ実行してください。
その後、トリガーで時間ベース「dailyUpdate」をしたい時間に指定して完了です。

何かの参考になれば幸いです。

この記事が気に入ったらサポートをしてみませんか?