web-dev-qa-db-ja.com

シートの名前をセルに入力するGoogleスプレッドシートの数式はありますか?

次の図が役立ちます。

enter image description here

23
orschiro

あなたには2つの選択肢があり、私がそれらの枯れのファンかどうかはわかりませんが、それは私の意見です。あなたは違うと感じるかもしれません:

オプション1:関数を強制的に実行します。

セル内の関数は、変更されたセルを参照しない限り実行されません。シート名を変更しても、スプレッドシートの機能はトリガーされません。ただし、範囲を渡すことで関数を強制的に実行でき、その範囲内のアイテムが変更されるたびに、関数がトリガーされます。

以下のスクリプトを使用して、名前を取得するカスタム関数を作成できます。

function mySheetName() {
  var key = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
  return key;
}

そして、セルに以下を配置します。

=mySheetName(A1:Z)

渡された範囲内のセルの値が変更されると、スクリプトが実行されます。これはスクリプトを実行するのに1秒かかり、値が変更されるたびにセルにメッセージを設定するので、非常に迷惑になります。すでに述べたように、トリガーするためには範囲を変更する必要もあるため、かなり静的なファイルではあまり役に立ちません。

オプション2:OnChangeイベントを使用

実行時は上記のオプションよりも快適であり、これはスプレッドシートのセルでの値の変更に依存しませんが、名前がどこに行くかを強制するため、これは好きではありません。必要に応じて、ユーティリティシートを使用して、さまざまなシートでこの場所を定義できます。以下は基本的な考え方であり、このオプションが気に入った場合に開始できるかもしれません。

OnChangeイベントは、シート名が変更されるとトリガーされます。エラーをチェックしたり、特定のシートでのみ機能するようにシートIDをチェックしたりするために、以下のコードをさらに洗練させることができます。ただし、基本的なコードは次のとおりです。

function setSheetName(e) {
  var key = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
  SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange('K1').setValue(key);
}

コードを保存したら、スクリプトエディターで、現在のプロジェクトの変更時トリガーをこの関数に設定します。変更イベントが発生すると、シート名がセルK1に書き込まれます。トリガーを設定するには、編集メニューで現在のプロジェクトのトリガーを選択します。

11
Karl_S

Googleスプレッドシートで見つけたものは次のとおりです。

Googleシートで現在のシート名を取得するには、次の簡単なスクリプトを使用すると、名前を手動で入力せずに役立ちます。次のようにしてください。

  1. [ツール]> [スクリプトエディター]をクリックします。

  2. 開いたプロジェクトウィンドウで、以下のスクリプトコードをコピーして空のコードウィンドウに貼り付けます。スクリーンショットを参照してください。

............................

function sheetName() {
  return SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
}

次に、コードウィンドウを保存し、名前を取得するシートに戻って、セルに=sheetname()という式を入力し、Enterキーを押すと、シート名がすぐに表示されます。

スクリーンショットを追加したこのリンクを参照してください: https://www.extendoffice.com/documents/Excel/5222-google-sheets-get-list-of-sheets.html

17

別のシートからシートを参照する場合、CELL関数を使用してシート名を取得できます。その後、正規表現を使用してシート名を抽出できます。

=REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1")

更新:数式は今後の変更で「シート名」を自動的に更新しますが、数式が最初に入力されたときにそのシートのセル(A1など)を参照する必要があります。

6
JohnP2

パラメータのシートリスト内の位置からシートの名前を返すスクリプトの私の提案です。パラメータが指定されていない場合、現在のシート名が返されます。

function sheetName(idx) {
  if (!idx)
    return SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
  else {
    var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
    var idx = parseInt(idx);
    if (isNaN(idx) || idx < 1 || sheets.length < idx)
      throw "Invalid parameter (it should be a number from 0 to "+sheets.length+")";
    return sheets[idx-1].getName();
  }
}

その後、任意の関数のようにセルで使用できます

=sheetName() // display current sheet name
=sheetName(1) // display first sheet name
=sheetName(5) // display 5th sheet name

他の回答で説明されているように、このコードをスクリプトに追加する必要があります:

Tools > Script editor
3
Nicolas Janel

他の人が使用するように作られたシートがあり、かなりの数のindirect()参照がありますので、変更されたシートタブ名を公式に処理する必要があります。

JohnP2(下記)の式を使用しましたが、シート名が変更されても自動的に更新されないため、問題が発生していました。実際の数式に移動し、任意の変更を加えてから更新して、再度実行する必要があります。

=REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1")

関数を強制的に更新する方法について this solution にある情報を使用してこれを解決しました。これは最もエレガントなソリューションではないかもしれませんが、更新されたシートタイトルをキャッチできるように、Sheetsがこのセルに注意を払って定期的に更新することを強制しました。

=IF(TODAY()=TODAY(), REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1"), "")

これを使用すると、Sheetsは変更を加えるたびにこのセルを更新することを認識します。これにより、ユーザーが名前を変更するたびにアドレスが更新されます。

2
Luke Allpress

古いスレッドですが、便利なものです...次は追加のコードです。

まず、一重引用符を含むシート名では正規表現が貪欲すぎて失敗するというクレイグの指摘に応えて、これはトリックを実行する必要があります(「SHEETNAME」!A1を独自のシートとセル参照に置き換えてください):

=IF(TODAY()=TODAY(), SUBSTITUTE(REGEXREPLACE(CELL("address",'SHEETNAME'!A1),"'?(.+?)'?!\$.*","$1"),"''","'", ""), "")

遅延一致( "。+?")を使用して、文字列(引用符を含む)を検索します。この文字列は、引用符で囲まれている場合と囲まれていない場合があります。 。 Googleスプレッドシートは、実際にシート名内のクォートを別のクォートを追加することで保護します( ''など)。したがって、これらを単一のクォートに戻すにはSUBSTITUTEが必要です。

数式では、前髪( "!")を含むシート名も使用できますが、前売り( "!$")を使用した名前では失敗します-シート名を完全な絶対セル参照のようにする必要がある場合は、バングとドルを区切る文字(スペースなど)。

数式が存在するシートとは異なるシートをポイントすると、onlyが正しく機能することに注意してください!これは、同じシートで使用した場合、CELL( "address"がセル参照(シート名ではなく)のみを返すためです。独自の名前を表示するシートが必要な場合は、別のシートのセルに数式を入力して、ターゲットシートから、ターゲットシートの数式セルを参照します。ワークブックには、設定、一般的な値、データベースの一致条件などを保持する「メタ」シートがあります。

他の人が上記で何度も言っているように、ワークシートの再計算を「変更時および毎分」に設定した場合、Googleスプレッドシートはシート名の変更のみを通知します。変更が反映されるまでに最大1分かかる場合があります。


第二に、私と同じように、GoogleスプレッドシートとExcel(少なくとも古いバージョンではREGEXREPLACE機能を持たない)の両方で機能する相互運用可能な数式が必要になった場合は、次を試してください。

=IF(IFERROR(INFO("release"), 0)=0, IF(TODAY()=TODAY(), SUBSTITUTE(REGEXREPLACE(CELL("address",'SHEETNAME'!A1),"'?(.+?)'?!\$.*","$1"),"''","'", ""), ""), MID(CELL("filename",'SHEETNAME'!A1),FIND("]",CELL("filename",'SHEETNAME'!A1))+1,255))

これは、INFO( "release")を使用して現在のプラットフォームを判断します。Excelは0より大きい数値を返しますが、GoogleスプレッドシートはINFO関数を実装せず、数式が0にトラップされて数値比較に使用されるエラーを生成します。 Googleコードブランチは上記のとおりです。

わかりやすく完全にするために、これはExcel専用バージョンです(does存在するシートの名前を正しく返します):

=MID(CELL("filename",'SHEETNAME'!A1),FIND("]",CELL("filename",'SHEETNAME'!A1))+1,255)

CELL( "filename"の出力で "]"ファイル名ターミネータを探し、MID関数を使用して文字列の残りの部分からシート名を抽出します。Excelではシート名に "]"を含めることができません。相互運用可能なバージョンでは、Excelは存在しないREGEXREPLACE関数への呼び出しを喜んで提供します。これは、Googleコードブランチを実行できないためです。

1
Angeltek

スクリプトを使用せずに最終的に半自動で動作するようにしました...以前の回答から少し借りて、時間を表示するために= NOW()しか持たないセルから始めます。たとえば、これをセルA1に入れます...

=NOW()

この機能は、毎分自動的に更新されます。次のセルに、シートの名前を使用して前のセルを指すポインター式を配置します。たとえば、これをA2に入れます...

='Sheet Name'!A1

セルの書式設定は別として、この時点でセルA1とA2は同じコンテンツ、つまり現在の時刻を表示するはずです。

そして、最後のセルは、正規表現を使用して2番目のセルから式を取り出し、その式からシートの名前を取り除く以前のソリューションから借りている部分です。たとえば、これをセルA3に入れます...

=REGEXREPLACE(FORMULATEXT(A2),"='?([^']+)'?!.*","$1")

この時点で、A3に表示される結果の値はシートの名前になります。

私の経験から、シートの名前が変更されるとすぐに、A2の式がすぐに更新されます。ただし、A3の更新をトリガーするには十分ではありません。ただし、セルA1が時間を再計算するたびに、セルA2の数式の結果はその後更新され、次にA3がトリガーされて新しいシート名で更新されます。それはコンパクトなソリューションではありません...しかし、うまくいくようです。

0
Craig