投稿

googleスプレッドシートで名前範囲内のデータが更新された時にタイムスタンプを更新

Quick Edit Pencil
function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  var range = e.range;
  var namedRange = e.source.getRangeByName("YourNamedRange"); // 名前付き範囲を指定
  var timestampSheet = e.source.getSheetByName("YourTimestampSheet"); // タイムスタンプを表示するシートを指定
  var timestampCell = timestampSheet.getRange("A1"); // タイムスタンプを表示するセルを指定

  // 名前付き範囲内のセルが編集された場合
  if (range.getA1Notation() === namedRange.getA1Notation() || 
      (range.getRow() >= namedRange.getRow() && range.getRow() < namedRange.getLastRow() &&
       range.getColumn() >= namedRange.getColumn() && range.getColumn() < namedRange.getLastColumn())) {
      if (timestampCell) {
        var currentDate = new Date();
        var formattedDate = Utilities.formatDate(currentDate, Session.getScriptTimeZone(), "yyyy/MM/dd HH:mm");
        timestampCell.setValue("Last Update Date: " + formattedDate); // 書式を指定してタイムスタンプを設定
      }
  }
}
名前付き範囲が複数ある場合
function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  var range = e.range;
  var timestampSheet = e.source.getSheetByName("YourTimestampSheet"); // タイムスタンプを表示するシートを指定
  var timestampCell = timestampSheet.getRange("A1"); // タイムスタンプを表示するセルを指定

  // 監視する名前付き範囲のリスト
  var namedRanges = ["NamedRange1", "NamedRange2", "NamedRange3"]; // 監視する名前付き範囲を指定

  // 監視する名前付き範囲のいずれかが編集された場合
  for (var i = 0; i < namedRanges.length; i++) {
    var namedRange = e.source.getRangeByName(namedRanges[i]);
    if (namedRange) {
      if (range.getA1Notation() === namedRange.getA1Notation() || 
          (range.getRow() >= namedRange.getRow() && range.getRow() < namedRange.getLastRow() &&
           range.getColumn() >= namedRange.getColumn() && range.getColumn() < namedRange.getLastColumn())) {
        var currentDate = new Date();
        var formattedDate = Utilities.formatDate(currentDate, Session.getScriptTimeZone(), "yyyy/MM/dd HH:mm");
        timestampCell.setValue("Last Update Date: " + formattedDate); // 書式を指定してタイムスタンプを設定
        break; // 1つの範囲が編集されたらループを終了
      }
    }
  }
}
Google スプレッドシートの「トリガー」を使用して、特定のセルが編集されたときに自動的に実行される「イベントハンドラー」です。具体的には、onEdit(e) 関数は、スプレッドシート内の任意のセルが編集されたときに自動的に呼び出されます。

仕組みの説明

onEdit(e): この関数は、スプレッドシート内のセルが編集されるたびに自動的に実行されます。e はイベントオブジェクトで、どのセルが編集されたかなどの情報を含んでいます。


監視: スクリプトは、特定の名前付き範囲内のセルが編集されたかどうかを監視しています。もしその範囲内のセルが編集された場合、指定したセルにタイムスタンプを更新します。


カスタム関数との違い: カスタム関数は、スプレッドシートのセルに直接入力して使用する関数で、手動で呼び出す必要があります。一方、onEdit トリガーは自動的に実行されるため、ユーザーが何かを入力するたびに自動的に反応します。
まとめ

このスクリプトは、特定のセルが編集されたときに自動的にタイムスタンプを更新するためのものであり、カスタム関数ではなく、イベントに基づいて動作するものです。これにより、ユーザーは手動で関数を呼び出す必要がなく、スプレッドシートの操作がよりスムーズになります。

googleスライドにリンクした表を更新するスクリプト

Quick Edit Pencil
GASについて質問ですGoogleスライド内にスプレッドシート... - Yahoo!知恵袋
↑の結果は
2024/7/17 9:34 の情報では不可能な様子でした。グラフはできるそうです。

↑の結果は
2023/06/25 12:30 の情報では不可能な様子でした。グラフはできるそうです。

キーワード
googleスライド、リンクされたオブジェクトを更新、Google Apps Script

blender4.1 レンダリング画像を左右反転する方法

Quick Edit Pencil

>方法: コンポジティングを使用する
レンダリング: 通常通りにシーンをレンダリングします。
コンポジティング: コンポジティングノードを使用して、レンダリング結果を左右反転させることができます。
「コンポジティング」タブに移動し、「Use Nodes」を有効にします。
Image」ノードを追加し、レンダリング結果を接続します。
Transform」ノードを追加し、X軸のスケールを-1に設定します。
最後に「Composite」ノードに接続します。


コンポジティングノードでの反転のしかたを初心者にもわかるように詳しく教えて

.
GPT-4o mini



Blenderのコンポジティングノードを使用して画像を左右反転させる方法を、初心者向けに詳しく説明します。以下の手順に従ってください。


ステップ1: シーンをレンダリングする
シーンを作成: Blenderでシーンを作成し、レンダリングしたいオブジェクトを配置します。
レンダリング: F12キーを押してシーンをレンダリングします。レンダリングが完了すると、画像が表示されます。

ステップ2: コンポジティングタブに移動
コンポジティングタブを開く: 上部のタブから「コンポジティング」を選択します。
ノードを使用する: Use Nodes」にチェックを入れます。これにより、ノードエディタが表示されます。

ステップ3: ノードを設定する
レンダー結果ノードを追加:
右クリックして「Add」メニューを開き、「Input」から「Render Layers」を選択します。これがレンダリング結果を取得するノードです。
変換ノードを追加:
再度右クリックして「Add」メニューを開き、「Distort」から「Transform」を選択します。これが画像を変換するためのノードです。
コンポジットノードを追加:
もう一度右クリックして「Add」メニューを開き、「Output」から「Composite」を選択します。これが最終的な出力ノードです。

ステップ4: ノードを接続する
ノードを接続:
Render Layers」ノードの出力(右側の出力ポイント)を「Transform」ノードの入力(左側の入力ポイント)に接続します。
Transform」ノードの出力を「Composite」ノードの入力に接続します。

ステップ5: 反転設定を行う
Transformノードの設定:
Transform」ノードを選択し、プロパティパネルで「X Scale」の値を-1に設定します。これにより、画像が左右反転します。

ステップ6: レンダリング結果を確認する
ノードを確認: ノードが正しく接続されていることを確認します。
レンダリング: F12キーを押して再度レンダリングします。コンポジティングノードを通じて、左右反転された画像が表示されるはずです。
ステップ7: 画像を保存する
画像を保存: レンダリング結果が表示されたら、Imageメニューから「Save As」を選択して、反転された画像を保存します。
これで、Blenderのコンポジティングノードを使用して画像を左右反転させる方法が完了です。もし何か不明な点があれば、遠慮なく質問してください!<

blender4.1 マテリアルが設定されているオブジェクトの一覧を取得するスクリプト

Quick Edit Pencil
GPT-4o mini


Blender 4.1では、Pythonスクリプトを使用してシーン内のオブジェクトを操作することができます。以下のスクリプトは、特定のプレフィックスを持つマテリアルが適用されているメッシュオブジェクトの一覧を取得し、コンソールに表示するものです。

python

コードをPython Consoleにコピーして使う。
import bpy

# 検索するマテリアル名のプレフィックス
material_prefix = "Material.020"

# マテリアルが適用されているオブジェクトをリストアップ
found_objects = False  # オブジェクトが見つかったかどうかのフラグ
for obj in bpy.data.objects:
    if obj.type == 'MESH':  # メッシュオブジェクトのみを対象
        for mat in obj.data.materials:
            if mat and mat.name.startswith(material_prefix):  # プレフィックスで始まるか確認
                print(f"オブジェクト名: {obj.name} に {mat.name} が適用されています。")
                found_objects = True

if not found_objects:
    print(f"{material_prefix} で始まるマテリアルが適用されているオブジェクトは見つかりませんでした。")
スクリプトの説明 モジュールのインポート: import bpy: BlenderPython APIを使用するために、bpyモジュールをインポートします。 マテリアル名のプレフィックス設定: material_prefix = "Material.020": 検索対象とするマテリアル名のプレフィックスを設定します。この例では「Material.020」で始まるマテリアルを探します。 オブジェクトのリストアップ: found_objects = False: オブジェクトが見つかったかどうかを示すフラグを初期化します。 for obj in bpy.data.objects: Blenderのデータブロックからすべてのオブジェクトをループ処理します。 メッシュオブジェクトのフィルタリング: if obj.type == 'MESH': オブジェクトがメッシュタイプであるかを確認します。メッシュオブジェクトのみを対象とします。 マテリアルの確認: for mat in obj.data.materials: オブジェクトに適用されているすべてのマテリアルをループ処理します。 if mat and mat.name.startswith(material_prefix): マテリアルが存在し、指定したプレフィックスで始まるかを確認します。 結果の表示: print(f"オブジェクト名: {obj.name} に {mat.name} が適用されています。"): 条件を満たす場合、オブジェクト名とマテリアル名をコンソールに表示します。 found_objects = True: オブジェクトが見つかったことを示すためにフラグを更新します。 オブジェクトが見つからなかった場合の処理: if not found_objects: もしオブジェクトが見つからなかった場合、適切なメッセージを表示します。 このスクリプトを使用することで、特定のマテリアルが適用されているメッシュオブジェクトを簡単にリストアップすることができ、Blenderでの作業を効率化することができます。

Blender 4.1 マテリアルスロット削除(名前指定と空のマテリアルスロット):スクリプトを使った簡単な手法

Quick Edit Pencil

名前指定する場合

WhiteMaterialから始まる名前のスロットを除去) GPT-4o mini Blender 4.1でアクティブコレクション内のすべてのオブジェクトをループし、マテリアルスロットから名前が 'WhiteMaterial' で始まるものを削除するためのスクリプトは以下のようになります。 python コードをコピー
import bpy

# アクティブコレクションを取得
active_collection = bpy.context.view_layer.active_layer_collection

# アクティブコレクション内のすべてのオブジェクトをループ
for obj in active_collection.collection.objects:
    # オブジェクトがメッシュであることを確認
    if obj.type == 'MESH':
        # マテリアルスロットを逆順でループ(削除するため)
        for i in range(len(obj.material_slots) - 1, -1, -1):
            # マテリアルスロットの名前を取得
            material_slot = obj.material_slots[i]
            if material_slot.material and material_slot.material.name.startswith('WhiteMaterial'):
                # オブジェクトをアクティブにする
                bpy.context.view_layer.objects.active = obj
                # マテリアルスロットを削除
                bpy.ops.object.material_slot_remove()
このスクリプトをBlenderのスクリプトエディタにコピーして実行すると、アクティブコレクション内のすべてのメッシュオブジェクトのマテリアルスロットから、名前が 'WhiteMaterial' で始まるものが削除されます。注意点として、マテリアルスロットを削除する際には、オブジェクトをアクティブにする必要があるため、その部分も含めています。

空のマテリアルスロット除去

GPT-4o mini 空のマテリアルスロットを削除するスクリプトは以下の通りです。このスクリプトでは、マテリアルスロットが空であるかどうかを確認し、空であれば削除します。 python コードをコピー
import bpy

# アクティブコレクションを取得
active_collection = bpy.context.view_layer.active_layer_collection

# アクティブコレクション内のすべてのオブジェクトをループ
for obj in active_collection.collection.objects:
    # オブジェクトがメッシュであることを確認
    if obj.type == 'MESH':
        # マテリアルスロットを逆順でループ(削除するため)
        for i in range(len(obj.material_slots) - 1, -1, -1):
            # マテリアルスロットの取得
            material_slot = obj.material_slots[i]
            # マテリアルスロットが空であるか確認
            if material_slot.material is None:
                # オブジェクトをアクティブにする
                bpy.context.view_layer.objects.active = obj
                # マテリアルスロットを削除
                bpy.ops.object.material_slot_remove()
このスクリプトをBlenderのスクリプトエディタにコピーして実行すると、アクティブコレクション内のすべてのメッシュオブジェクトの空のマテリアルスロットが削除されます。空のマテリアルスロットは、material_slot.material None である場合に該当します。
GPT-4o miniへの命令文
blender4.1のアクティブコレクション内のすべてのオブジェクトをループしてオブジェクトのマテリアルスロットから 'WhiteMaterial' で始まるものを削除する。マテリアルスロットを削除する命令は次を使う事。bpy.ops.object.material_slot_remove() ただし、bpy.ops.object.material_slot_remove({'active_object': obj})のような引数を書くとエラーが出るので、引数を使わない方法で書いてほしい。ついでに、空のマテリアルスロットを削除するスクリプトに改造したスクリプトも書き出して。

blender フリースタイル設定

Quick Edit Pencil







 

blender4.1 スクリプトをキーボードショートカットに登録する

Quick Edit Pencil
「# ここに実行したいスクリプトの内容を記述」に以下のスクリプトを登録したい。

... script ...


GPT-4o mini



指定されたスクリプトをBlenderのオペレーターとして登録し、キーボードショートカットを設定する手順を以下に示します。このスクリプトは、現在のシーンのカメラやコレクション名を使って、レンダリングファイルのパスを設定し、レンダリングを実行します。

スクリプトをオペレーターとして登録する手順
Blenderのテキストエディタを開く:
Blenderを開き、テキストエディタを表示します。
スクリプトを入力:
以下のコードをテキストエディタに入力します。
python

コードをコピー
import bpy
import os

class RenderWithCustomPathOperator(bpy.types.Operator):
    bl_idname = "render.custom_render"
    bl_label = "Render with Custom Path"

    def execute(self, context):
        # 現在のシーンを取得
        scene = bpy.context.scene

        # 現在のシーンのカメラを取得
        camera = scene.camera

        # シーン名を取得
        scene_name = scene.name

        # カメラ名を取得
        camera_name = camera.name if camera else "NoCamera"

        # アクティブなコレクションを取得
        active_collection = bpy.context.view_layer.active_layer_collection
        active_collection_name = active_collection.name if active_collection else "NoCollection"

        # レンダリング設定を取得
        render = bpy.context.scene.render

        # render.filepathが設定されているか確認
        if not render.filepath:
            self.report({'ERROR'}, "Error: render.filepath is not set. Aborting.")
            return {'CANCELLED'}
        else:
            # ファイル名を除いたパスを取得
            directory = os.path.dirname(render.filepath)

            # 新しいパスを設定
            new_filepath = os.path.join(directory, f"{active_collection_name}_{camera_name}_{scene_name}.png")
            render.filepath = new_filepath

            # レンダリングを実行
            bpy.ops.render.render(write_still=True)
            return {'FINISHED'}

def register():
    bpy.utils.register_class(RenderWithCustomPathOperator)

def unregister():
    bpy.utils.unregister_class(RenderWithCustomPathOperator)

if __name__ == "__main__":
    register()
スクリプトを実行:
テキストエディタの「Run Script」ボタンをクリックして、スクリプトを実行します。
キーボードショートカットを設定:
Blenderの「Edit」メニューから「Preferences」を選択します。
Keymap」タブを開きます。
3D View」セクションを展開し、「3D View」または「3D View (Global)」の下にある「Add New」ボタンをクリックします。
新しいショートカットを追加し、以下のように設定します:
Identifier: render.custom_render
Key: 実行したいキー(例: RF12など)
Type: キーのタイプ(例: PRESSRELEASEなど)
設定を保存する:
設定が完了したら、Preferencesウィンドウを閉じます。
スクリプトを実行する: 3Dビューに戻り、設定したキーボードショートカットを押すと、指定された条件に基づいてレンダリングが実行されます。 これで、指定されたスクリプトをBlenderで実行するためのオペレーターとキーボードショートカットが設定されました。何か他に質問があれば、お知らせください!<
参考
3dcgソフトのblender4.1で特定のスクリプトを実行するためのキーボードショートカットを作りたい。どうする

.
GPT-4o mini



Blender 4.1で特定のスクリプトを実行するためのキーボードショートカットを作成する手順は以下の通りです。

スクリプトを作成する:
Blenderのテキストエディタを開き、実行したいスクリプトを入力します。
スクリプトを保存します(例: my_script.py)。
スクリプトを登録する:
スクリプトを実行するためのオペレーターを定義します。以下のようなコードを使用して、スクリプトをオペレーターとして登録します。
python

コードをコピー
import bpy

class MyCustomOperator(bpy.types.Operator):
    bl_idname = "wm.my_custom_operator"
    bl_label = "My Custom Operator"

    def execute(self, context):
        # ここに実行したいスクリプトの内容を記述
        print("スクリプトが実行されました")
        return {'FINISHED'}

def register():
    bpy.utils.register_class(MyCustomOperator)

def unregister():
    bpy.utils.unregister_class(MyCustomOperator)

if __name__ == "__main__":
    register()
キーボードショートカットを設定する:
Blenderの「Edit」メニューから「Preferences」を選択します。
Keymap」タブを開きます。
3D View」や「Text Editor」など、ショートカットを設定したいエリアを選択します。
Add New」ボタンをクリックして新しいショートカットを追加します。
新しいエントリの「Identifier」に先ほど定義したオペレーターのID(例: wm.my_custom_operator)を入力します。
Key-binding」フィールドで希望のキーを設定します。
設定を保存する:
Preferencesウィンドウを閉じる前に、設定を保存することを忘れないでください。
これで、設定したキーボードショートカットを押すことで、特定のスクリプトを実行できるようになります。