Googleドキュメントの変数としての現在の日付?


12

現在の日付の変数をGoogleドキュメントに追加(挿入)して、ドキュメントを開くたびに自動的に更新されるようにすることはできますか?

いくつかの基準:

  • 日付の位置は可変でなければなりません。つまり、ページ/段落の異なる位置に日付を挿入できるようにする必要があります

  • ドキュメントは引き続き共有可能である必要があります。つまり、私のドキュメントを開いたユーザーにも現在の日付が表示されます


現在の日付の計算にはどのタイムゾーンを使用する必要がありますか?
ルベン・

それを多目的に使用するには、設定でユーザー自身が定義しますか?それとも、ユーザーのGoogleドキュメント設定から何らかの方法で自動的に取得できますか?
orschiro

1
ちょうど私のコーディングの試みを追加しました。タイムゾーンに関しては、GMT-5を使用しましたが、必要に応じて簡単に変更できます。これは完全なソリューションではありません。
ルベン・

回答:


9

短い答え

現時点では、変数はGoogleドキュメントの組み込み機能ではありません。Googleドキュメントを拡張するプラットフォームであるGoogle Apps Scriptには、変数を処理するためのクラスまたはメソッドが含まれていません。

代替案

代替案1

1つの選択肢はテキストパターンを使用することですが、更新する日付のみに一致することを確認する必要があります。

代替案2

別の方法は、クラスNamedRangeを使用することですが、

  1. 範囲を移動すると、名前が失われます1
  2. 名前付き範囲のテキストを複数の要素で置き換えると、初めて機能するだけです2

コード:

次のコードは、Googleドキュメントにバインドされたスクリプトで使用するためのもので 2つの主要な機能があります。

  1. 今日の日付を挿入
  2. 今日の日付を更新

デバッグ目的で使用されています

  1. 日付のみではなく、日付と時刻。
  2. メイン機能をトリガーするカスタムメニュー。

「既知の問題」:更新機能により、段落全体が置き換えられます。

コードをテストするには、コードをコピーしてからGoogleドキュメントに移動し、新しいドキュメントを作成して、[ツール]> [スクリプトエディター]をクリックし、[空のプロジェクト]を選択して、コードを貼り付け、プロジェクトを保存し、名前を割り当て、アプリを承認するために時間どおりに実行します、ドキュメントを閉じて再度開きます。「ユーティリティ」という新しいメニューが表示されます。そこからメイン関数を呼び出すことができます。

function onOpen() {
  // Add a menu with some items, some separators, and a sub-menu.
  DocumentApp.getUi().createMenu('Utilities')
      .addItem('Insert Today\'s Date', 'insertTodayAtCursor')
      .addItem('Update Today\'s Date', 'setTodayNamedRange')
      .addToUi();
}

function todayDate(){
  return Utilities.formatDate(new Date(), "GMT-5", "yyyy-MM-dd'T'HH:mm:ss'Z'"); // "yyyy-MM-dd"
}

/**
 * Inserts the today's date at the current cursor location and create a NamedRange.
 */
function insertTodayAtCursor() {
  var str = 'testToday';
  var doc = DocumentApp.getActiveDocument();
  var cursor = doc.getCursor();

  if (cursor) {
    // Attempt to insert today's date at the cursor position. If insertion returns null,
    // then the cursor's containing element doesn't allow text insertions.
    var date = todayDate();
    var element = cursor.insertText(date);
    if (element) {
      var rangeBuilder = doc.newRange();
      rangeBuilder.addElement(element);
      return doc.addNamedRange(str, rangeBuilder.build()); 
    } else {
      DocumentApp.getUi().alert('Cannot insert text at this cursor location.');
    }
  } else {
    DocumentApp.getUi().alert('Cannot find a cursor in the document.');
  }
}

function setTodayNamedRange(){
  var str = 'testToday';
  var doc = DocumentApp.getActiveDocument();
  // Retrieve the named range
  var namedRanges = doc.getNamedRanges();
  var newRange = doc.newRange();
  var date = todayDate();
  for(var i=0; i<namedRanges.length; i++){

    if(namedRanges[i].getName() == str){

      var rangeElement = namedRanges[i].getRange().getRangeElements();

      for (var j=0; j<rangeElement.length; j++){

        var element = rangeElement[j].getElement().asText().editAsText().setText(date);
        newRange.addElement(element);
      }
    }
  }
  doc.addNamedRange(str, newRange.build());
}


以下に、インスピレーションを得たり、「正しい方向」を指して「解決策」を見つけたりするのに役立つ、さまざまな種類の項目(質問、仕様など)があります。


脚注


それは不可能だという意味ですか?
Jacob Jan Tuinstra、2015

@JacobJanTuinstra:私見、はい、それは不可能です。可能なことは回避策を見つけることですが、それはより多くのコンテキストが必要です。私はその情報を求めコメントで行われるべきだと思うが、私はどこにもまだコメントすることはできません:)
ルベン・

1
@orschiroそれがあなたのために働いたことを知ってうれしいです。Chrome拡張機能にリファクタリングするのではなく、Googleドキュメントのアドオンに含めることができると思います。
ルベン・

1
@ChristopherFrancisco:コードは制限付きスクリプトで使用することを目的としていますが、アプリから使用するように適合させることもできますが、スタックオーバーフローに適している可能性が高いという別の質問です。
ルベン・

1
@ChristopherFrancisco Googleドキュメントエディターファイルにバインドされたスクリプトに関する公式ガイドへのリンクを追加しました。
ルベン・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.