あなたの具体的な質問は次のとおりです。
私の質問: スクリプトが値の最初の出現の 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)
};