web-dev-qa-db-ja.com

Googleスプレッドシートの期間入力の問題

私たちはAppleの数値を使用していますが、この数値はGoogleよりも少し優れているようです(それか、何か不足しています)。 Appleの数値で、「期間」形式のセルに90mと入力すると、自動的に1h 30mに変換されます。

Googleスプレッドシートで90mを入力すると、入力が「テキスト」に変換されてセルの左側にぶつかるように見えます。 「1h 30m」と入力すると、同じことが起こります。 「00:90:00」と入力すると、1h 30m1:30に変換され、同じ結果が得られます。 1h 30mと入力すると、表示されるはずの正確な表示では、それが継続時間としてではなくテキストとして認識されます。

これが私が話していることの簡単な例です:Typedは="@"としてフォーマットされたので、右の列に入力した方法を正確に保持します:

Here is a quick example of what I am talking about: Typed was formatted as ="****" so that it would preserve exactly how I typed it in the right column

そのため、1日に数百行を入力します。すべてをxx:xx形式で入力することは、お尻の大変な苦痛です。 Googleスプレッドシートで90mを90分として認識し、プログラムされた形式に変換する方法はありますか?

2
Jason Krueger

現時点では、Googleスプレッドシートには自動データ型割り当てをカスタマイズする方法は含まれていませんが、Google Appsスクリプトを使用して入力をある型から別の型に自動的に変換することは可能ですが、いくつかの制限がありますが、最も簡単なソリューションから始めましょう。もう1つのQ&Aでは、既知の制限を回避する方法と、一般的な関心のある場合に発生する問題について説明します。

アドオンがすでに存在している可能性があります。推奨事項が必要な場合は、 ソフトウェアの推奨事項 に質問を投稿してください。

一般的な手順

  1. Apps Scriptプロジェクトを作成する
  2. シンプルな編集機能を追加する
  3. JavaScriptを追加して、#unitの形式の入力をGoogle期間に変換します
  4. 単純な編集機能を完了して、結果をスプレッドシートに返します。

Apps Scriptプロジェクトを作成します

  1. [ツール]> [スクリプトエディター]をクリックします
  2. 無題プロジェクトをクリックするか、プロジェクトを保存してプロジェクトに名前を割り当てます

注:これが最初のプロジェクトであり、まだ多くを作成する計画がない場合は、名前は何でもかまいませんが、短い説明的な名前が常に適切です

on editシンプルトリガーを追加します。

  1. デフォルトのコードを
function onEdit(e){

}

JavaScriptコードを追加します
シンプルな編集機能を実行して、結果をスプレッドシートに返します

便宜上、最後の2つのステップのコードを1つのコードブロックに追加しました。

function onEdit(e) {
  var duration = stringToDuration(e.value);
  if(e.value !== duration) {
    e.range.setValue(duration);
    e.range.setNumberFormat('[h]:mm'); // Here you can set the number format to use
  }
}

/**
 * Converts a string to a Google Sheet duration value
 *
 * @param {String} input The string to be converted
 * @returns An Integer if the input format is supported otherwise returns the input
 */
function stringToDuration(input){
  if(!typeof input === 'string') return input;
  var date = new Date(0);
  var match = input.match(/^(\d.*)(.)/);
  var value = parseFloat(match[1]);
  var isDuration = true;
  switch(input[2]){
    case 'm':
      date.setMinutes(value);
      break;
    case 'h':
      date.setHours(value);
      break;
    default:
      output = input;
      isDuration = false;
  }
  var output;
  if(isDuration) {
    var oneDayInMS = 24*60*60*1000;
    output = date.getTime() / oneDayInMS;
  } else {
    output = input;
  }
  return output
}

[〜#〜]備考[〜#〜]

  1. 上記のコードでは、#m(90mなど)と#h(1.5hなど)の2つのケースのみを考慮しています。完全なソリューションとして、moment.jsのようなJavaScriptライブラリのコードを適合させます。
  2. Google Apps Scriptトリガーは「ベストエフォート」ベースで機能します。これは、編集時、フォーム送信時などのトリガーがトリガーされない場合があることを意味します。 I.E.タイプが多くの値を高速化する場合、一部の編集はonEdit関数をトリガーしますが、他のトリガーはトリガーしません。そのため、時間駆動型トリガーを使用して、変換されなかった値をスキャンしてから変換できます。
  3. 制限付きプロジェクトスクリプトのonEdit関数は、制限付きスプレッドシートでのみ使用できます。すべてのスプレッドシートで使用できるようにするには、アドオンを作成し、アカウントにインストールして、使用するスプレッドシートで有効にします。
0
Rubén