2016-10-16 11 views
2

私は何を達成しようとしている:最初の行から開始して、スプレッドシート内のすべての行を取得します複数の行を1つずつ取得してその値を確認するにはどうすればよいですか?

  • をし、最後の行
  • で終了すると、その行の値
  • は「
  • 」に値を比較します
  • その行の任意の値であれば==「」、その行を削除し、他の
  • は、次の行に継続して
を繰り返して次の行に続けます

これは私がこれまで持っていたものです。私はスプレッドシートとその値のすべての行を取得できます。私は行を1つずつ取得し、次にその行の値をチェックした後に次の行に移動する方法がわかりません。

[16-10-19 01:28:52:863 EDT] Spreadsheet.deleteRow([3]) [0.06 seconds] 
[16-10-19 01:28:52:914 EDT] Spreadsheet.deleteRow([4]) [0.051 seconds] 
[16-10-19 01:28:52:967 EDT] Spreadsheet.deleteRow([7]) [0.053 seconds] 
[16-10-19 01:28:52:989 EDT] Spreadsheet.deleteRow([9]) [0.021 seconds] 
[16-10-19 01:28:52:992 EDT] Execution failed: Those rows are out of bounds. 

コード:

var artistFile = SpreadsheetApp.openById(fileId); //open spreadsheet 
var artistFileRows = artistFile.getActiveSheet().getMaxRows(); //get number of rows in spreadsheet 

var startL = "A"; //start column 
var endL = "F"; //end column 

//get row one by one 
for (var a = 0; a < artistFileRows; a++) 
{ 
    var range = startL + parseInt(a + 1) + ":" + endL + parseInt(a + 1); //range = A1:AX -- X == last row number in spreadsheet 

    //get rows values 
    var values = artistFile.getRange(range).getValues(); 

    //compare rows values to '' 

    //delete rows with blank values 

    //move to next row and repeat 
} 

これは私

[16-10-14 20:50:34:622 EDT] row: 1, range: A1:F1 
[16-10-14 20:50:34:646 EDT] [[header1, header2, header3, header4, header5, header6]] 
[16-10-14 20:50:34:647 EDT] row: 2, range: A2:F2 
[16-10-14 20:50:34:671 EDT] [[d2, td2, ca2, cr2, t2, ns2]] 
[16-10-14 20:50:34:672 EDT] row: 3, range: A3:F3 
[16-10-14 20:50:34:695 EDT] [[d3, td3, ca3, cr3, t3, ns3]] 
[16-10-14 20:50:34:696 EDT] row: 4, range: A4:F4 
[16-10-14 20:50:34:722 EDT] [[, , , , , ]] 
[16-10-14 20:50:34:722 EDT] row: 5, range: A5:F5 
[16-10-14 20:50:34:748 EDT] [[, , , , , ]] 
[16-10-14 20:50:34:748 EDT] row: 6, range: A6:F6 
[16-10-14 20:50:34:774 EDT] [[d4, td4, ca4, cr4, t4, ns4]] 
[16-10-14 20:50:34:775 EDT] row: 7, range: A7:F7 
[16-10-14 20:50:34:799 EDT] [[test1, test1, test1, test1, test1, test1]] 
[16-10-14 20:50:34:799 EDT] row: 8, range: A8:F8 
[16-10-14 20:50:34:825 EDT] [[, , , , , ]] 
[16-10-14 20:50:34:825 EDT] row: 9, range: A9:F9 
[16-10-14 20:50:34:849 EDT] [[test2, test2, test2, test2, test2, test2]] 
[16-10-14 20:50:34:850 EDT] row: 10, range: A10:F10 
[16-10-14 20:50:34:874 EDT] [[t, , t, , , ]] 
[16-10-14 20:50:34:874 EDT] row: 11, range: A11:F11 
[16-10-14 20:50:34:899 EDT] [[, , , , , ]] 

編集

ログのログを提供します2

var count = 0; 
var index = []; 

for (var i = 0; i < allValues.length; i++) 
{ 
    for (var j = 0; j < allValues[i].length; j++) 
    { 
    Logger.log(allValues[i][j]); 
    if (allValues[i][j] === "") 
    { 
     index[count] = i; 
     count++; 
     break; 
    } 
    } 
} 

for (var i = 0; i < count; i++) 
{ 
    artistFile.deleteRow(index[i]); 
} 

編集私が間違っている行が削除される示す.deleteRow()を修正しました。 forループはvar i = 0で始まりますが、スプレッドシートの行は1行目から始まります。.deleteRow()をに変更しました。

今は削除する必要が右の行を示しています

[16-10-19 01:40:01:353 EDT] Spreadsheet.deleteRow([4]) [0.053 seconds] 
[16-10-19 01:40:01:406 EDT] Spreadsheet.deleteRow([5]) [0.052 seconds] 
[16-10-19 01:40:01:461 EDT] Spreadsheet.deleteRow([8]) [0.054 seconds] 
[16-10-19 01:40:01:484 EDT] Spreadsheet.deleteRow([10]) [0.023 seconds] 
[16-10-19 01:40:01:488 EDT] Execution failed: Those rows are out of bounds. 

そして、最後の行にエラーが.deleteRow([11])を示すべきである前に。

しかし、私はまだエラーを取得しています - Execution failed: Those rows are out of bounds.

+0

[?私はすべての空白行を取得する方法を(の可能性のある重複http://stackoverflow.com/questions/40027874/how-would-i-get-every-空白行) –

+0

を削除すると、ループの最後の行から最後の行に逆戻りして行インデックスが移動しないようにします –

答えて

2

これは確かに動作します:

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); 
    var data = sheet.getDataRange().getValues(); 

    var count = 0; 
    var index = []; 

//find the rows which contain 
for(var i=0;i<data.length;i++) 
{ 
    for(var j=0;j<data[i].length;j++) 
    { 
    Logger.log(" Row : "+i+" Column : "+j); 
     if(data[i][j]=="" || data[i][j]==" ") 
     { 
     index[count]=i+1; 
     Logger.log(index[count]); 
     count++; 
     break; 
     } 
    } 
} 

//delete the rows 
for(var i=0;i<count;i++) 
{ 
    sheet.deleteRow(index[i]-i); 
    Logger.log("Row "+index[i]+" deleted"); 
} 
+2

前のコードでは、行が削除されるたびに連続する行のインデックスが変更されるため、単一のループで複数の行を削除する際に、行のインデックスを確実に更新する必要があります。 –

+1

ありがとう、これは動作します。 – user4411473

+0

お寄せいただきありがとうございます。 :) –

1

ここでは、コードは次のとおりです。

var artistFile = SpreadsheetApp.openById(fileId); //open spreadsheet 
var sheet = artisiFile.getSheetByName(SheetName); //open the sheet where the data is stored 
var data = sheet.getDataRange().getValues(); 
var count = 0; 
var index = []; 

//find the rows which contain " 
for(var i=0;i<data.length;i++) 
{ 
    for(var j=0;j<data[i].length;j++) 
    { 
     if(data[i][j]=="\"") 
     { 
     index[count]=i; 
     count++; 
     } 
    } 
} 

//delete the rows 
for(var i=0;i<count;i++) 
{ 
    sheet.deleteRow(index[i]); 
} 
+0

削除されない行も削除しませんか? – user4411473

+0

いいえ、それはありません。可変インデックスは、最初のネストされたループで一致が検出された行のインデックスを格納しています。次のループでは、一致が見つかった行だけが削除されます。 –

+0

'.deleteRow(index [i]);'で 'Execution failed:これらの行が範囲外です。 'というエラーが表示されます。 また、空白の値を持たない行を削除しました... – user4411473

1

・ホープ、このことができます:

var artistFile = SpreadsheetApp.openById(fileId); //open spreadsheet 
    var sheet = artisiFile.getSheetByName(SheetName); //open the sheet where the data is stored 
    var data = sheet.getDataRange().getValues(); 
    var count = 0; 
    var index = []; 

//find the rows which contain " 
for(var i=0;i<data.length;i++) 
{ 
    for(var j=0;j<data[i].length;j++) 
    { 
     if(data[i][j]=="") 
     { 
     index[count]=i; 
     count++; 
     break; 
     } 
    } 
} 

//delete the rows 
for(var i=0;i<count;i++) 
{ 
    sheet.deleteRow(index[i]); 
} 

PS。私は2つの変更を加えただけです。

1)私は、要件に詳細を誤解していたので))(""

2を"\""を置き換えるには、(これは文句を言わない、削除すべきでない行が削除されていることを確認します)break;文を追加

+0

まだ同じエラーが発生しています。オリジナルの投稿をログとコードで編集します。 – user4411473

関連する問題