2

一意の値の最初にカウントされたインスタンスの上に単一の行を追加できるようにするスクリプトを作成しようとしています。

例えば。

    A
    German
    German
    German
    Italian
    Italian
    French
    French

スクリプトを実行すると、次のようになります。

    A
    DE
    German
    German
    German
    IT
    Italian
    Italian
    FR
    French
    French

私が書いたことは、存在する値の数を特定することだけです。

function insertRowAbove() 
 {
 var report = SpreadsheetApp.getActive().getSheetByName('REPORT');

 var lang = report.getRange('A10:A').getValues();
 var positions = report.getRange('A10:A').getA1Notation();
 var DE = [];

 for (var i = 0; i < lang.length; i++)
 {
  if (lang[i] == 'German') 
  {
    DE++
    report.getRange('A1').setValue(DE);//now I know there are 3 German entries
  }
 }
}

私の質問: スクリプトが値の最初の出現の A1notation を認識し、その上に行を追加することは可能ですか? 賢明なアドバイスをありがとうございます。

4

3 に答える 3

2

あなたの具体的な質問は次のとおりです。

私の質問: スクリプトが値の最初の出現の A1notation を認識し、その上に行を追加することは可能ですか?

探しているアイテムが見つかったかどうかを示すブール値といくつかのメソッドを組み合わせて使用​​することRangeで、最初に見つかったアイテムの A1 表記を取得できます。

var column = 1; // this example is only using column A
var foundGerman = false;
var firstGerman = '';
...
if (lang[i] == 'German') {
  if (!foundGerman) {
    foundGerman = true;
    firstGerman = range.getCell(i, column).getA1Notation();
  }
  ...
}

その後、「German」を含む最初のセルの A1Notation が得られます。

ただし、この関数insertRowsBefore()Sheetメソッドであり、A1Notation ではなく、行番号をパラメーターとして想定しています。そのため、最初のドイツの独房の住所を特定する必要はありません。

脚本

これが私のコンテストへのエントリーです!速度を上げるには、アプリ スクリプト サービスの呼び出しをできるだけ少なくすることをお勧めします。このスクリプトでは、すべてのデータ操作は配列を使用して行われ、最終結果は 1 回書き込まれます。

関心のある言語が 3 つ以上あることを想定して、保守性のために、言語ルックアップはオブジェクトによって処理されiso639ます。( ISO 639-1 Language Codesを使用していると仮定します。) その結果、実際の作業はわずか 10 行のコードで済みます。

function insertViaArray() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('REPORT');
  var values = sheet.getDataRange().getValues();
  var newValues = [];

  var iso639 = 
    {
      "German" : "DE",
      "Italian" : "IT",
      "French" : "FR"
    }

  var curLang = '';
  for (var i in values) {
    if (values[i][0] !== curLang) {
      curLang = values[i][0];
      newValues.push([iso639[curLang]]);
    }
    newValues.push([values[i][0]]);
  }
  sheet.getRange(1, 1, newValues.length, 1).setValues(newValues)
};

スクリプト V2 を編集

を使用して言語タグを挿入することで、コードをさらに 8 行に減らすことができ、並列配列Array.splice()が不要になります。newValues

function insertViaArrayV2() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('REPORT');
  var values = sheet.getDataRange().getValues();

  var iso639 = 
    {
      "German" : "DE",
      "Italian" : "IT",
      "French" : "FR"
    }

  var curLang = '';
  for (var i = 0; i < values.length; i++) {
    if (values[i][0] !== curLang) {
      curLang = values[i][0];
      values.splice(i, 0, [iso639[curLang]]);
    }
  }
  sheet.getRange(1, 1, values.length, 1).setValues(values)
};
于 2013-04-04T14:33:23.760 に答える
2

次のように動作します (を参照):

function insertRowAbove() {
 var report = SpreadsheetApp.getActive().getSheetByName('Insert Row Above');
 var values = report.getRange('B2:B').getValues();

 var prevVal = "null"; 
 var index = 1;
 while (index < values.length) {
   if (values[index].toString() != prevVal.toString()) {

     var header = 'unknown';
     if (values[index] == 'German')
       header = 'DE';
     else if (values[index] == 'Italian')
       header = 'IT';
     else if (values[index] == 'French')
       header = 'FR';

     report.insertRowBefore(index+1);
     report.getRange(index+1, 2).setValue(header);
     values = report.getRange('B2:B').getValues();
     index++;
   }
   prevVal = values[index];
   index++;
 }

}
于 2013-04-04T12:27:49.523 に答える
1

これは一種の面白い演習であり、いつものように、おそらく多くの方法で機能させることができます。

私は自分のアプローチが優れているふりをしているわけではありません。それは単に異なるだけなので、ここで示す価値があるでしょう ;-)

function testFunction() {
  var sh = SpreadsheetApp.getActiveSheet();
  var data = sh.getRange('A10:A').getValues();
  var rowNum = 11;
  var previous = data[0][0];
  Logger.log(data)
 sh.insertRowBefore(10);
 sh.getRange(2,1).setValue(firstLetters(data[0][0]));
  for(n=1;n<data.length;++n){
  if(data[n][0].replace(/ /g,'')==previous.replace(/ /g,'')){
     previous = data[n][0] ; 
     ++rowNum ; 
     continue ; 
     }else if(firstLetters(data[n][0])){
     sh.insertRowBefore(rowNum+1);
     sh.getRange(rowNum+1,1).setValue(firstLetters(data[n][0]));
     ++rowNum
     previous = data[n][0]
     ++rowNum
     Logger.log(rowNum+'  '+firstLetters(data[n][0]))
     }else{
     break
     }
}
}

function firstLetters(name){
if (name==''){return false}
var str = name.toString().replace(/ /g,'').toUpperCase().substring(0,2);
if (str=='GE') {str='DE'};// handle german exception
if (str=='PO'){ str='PT'} ;//handle portuguese exception
return str;
}

ここに画像の説明を入力

于 2013-04-04T13:06:28.017 に答える