2

私が取り組んでいる Google Apps Script Web App に関して、ここ数日でいくつかの質問を投稿しました。これまでのところ、ここの Serge は非常に役に立ちました。そのスクリプトに関する投稿はこちらです。

そのスクリプトに列を追加してuniqueIDカウンターを生成することを検討しています。これにより、新しいフォームが送信されると、カウンターは以前のuniqueIDを参照し、1ずつ増加します。アイデアは、ヘッダー行のある空白のスプレッドシートです。スクリプトはフォームの送信時に実行されます。A2 が空白で 1 が挿入されていることがわかります。次に送信されたフォームでは、A2 に 2 が表示され、1 が追加され、A3 に 3 が追加されます。

現在、セル内の数値に1を追加するカウンターだけに取り組んでいます。この作品を開発するときは、最後の行を取得し、セルの値を見つけて追加する必要があることを知っていますが、私は GAS に慣れていないため、自分自身を学びながら、ゆっくりと構築しようとしています。へ、まあ、あなたはアイデアを得る。

これが基本的なスタートであり、これが正しい方向性であるかどうか、フィードバックを得たいと思っていました..

function counter() {
   //Grabs the range and pinpoint cell
   var ssRange = SpreadsheetApp.getActiveSheet().getRange(1,1,1,1);
   //Grab the cell value of A1
   var value = ssRange.getValue();
   //if statement to check value in A1 and if it is null, undefined, false, 0, NAN
if (!value) {
  //if the cell is null, undefined, false, 0, NAN sets value to 1
   var setCell = ssRange.setValue(1);
}
  //if not updates the cell by getting the value and adding 1 to it
 else {
   var updateCell = ssRange.setValue(value + 1);  
}
}

編集 (.setProperty & .getProperty の Phil Bozak のヒントを使用するようにコードを更新

あなたが言及したように、スプレッドシートに挿入されたMYIDが手動で変更された場合、このコードがどのように処理されるかをまだテストしています。MYID が一意であることを確認する必要があります。それについて考える必要があります..ここにコードがあります..フィードバックは大歓迎です!

function counter2() {
  //Get the spreadsheet, range, and value of first cell in range
  var sSheet = SpreadsheetApp.getActiveSheet();
  var ssRange = sSheet.getRange(1,1,1,1);
  var ssValue = ssRange.getValue();
  var setUniqueID = ScriptProperties.setProperty("MYID",1);
  var getUniqueID = ScriptProperties.getProperty("MYID");

  //will set value of first cell to 1 if null, undefined, false, 0, NAN etc.. (runs in if //statement)
  var setOne = ssRange.setValue(getUniqueID);  

  if (!ssValue) {
  setOne;
  }
  else {

  //This goes back and get the range, lastrow of range, and value of first cell in           range of last row & adds 1 to that value

  var setLast = sSheet.getRange(lastRow+1,1,1,1).setValue(getUniqueID + 1); 
    setLast;
  }
  }
4

3 に答える 3

5

列のカウンターとして常に最後のカウント (最高値) である値を確実に取得する別の方法は次のとおりです: (コード内のコメント)

列Aの値は手動で変更できる可能性があると言ったとき、私はこの考えを持っていました...この場合、重複の可能性を回避する唯一のアプローチです(ただし、未使用の値を持つことを防ぐことはできません...必要に応じて)

function OnForm(){
var sh = SpreadsheetApp.getActiveSheet()
var startcell = sh.getRange('A1').getValue();
if(! startcell){sh.getRange('A1').setValue(1);return}; // this is only to handle initial situation when A1 is empty.
var colValues = sh.getRange('A1:A').getValues();// get all the values in column A in an array
var max=0;// define the max variable to a minimal value
  for(var r in colValues){ // iterate the array
    if(Number(colValues[r][0]>max)){max=colValues[r][0]};// get the highest numeric value in th column, no matter what happens in the column... this runs at array level so it is very fast
    }
    max++ ; // increment to be 1 above max value
sh.getRange(sh.getLastRow()+1, 1).setValue(max);// and write it back to sheet's last row.
}
于 2013-03-14T12:31:47.810 に答える
0
于 2013-03-14T01:42:52.153 に答える
0

わかりました..コードを少し更新しましたが、誰かが助けてくれることを望んでいる問題に遭遇しました。スクリプトは、スプレッドシートが空白であることを確認し、A1 に 1 を挿入します。次回の実行では、1 が A1 にあることがわかり、1 を追加して A2 に 2 を挿入します。それ以降、各行に2を何度も入れ続けます..コードは次のとおりです..なぜそれを行い、それぞれに1を追加してカウントを増やしていないのかわかりません。

function counter2() {
  var sSheet = SpreadsheetApp.getActiveSheet();
  var ssRange = sSheet.getRange(1,1,1,1);
  var ssValue = ssRange.getValue();
  var setOne = ssRange.setValue(1);  
  var lastRow = sSheet.getLastRow();  
  var setLast = sSheet.getRange(lastRow+1,1,1,1).setValue(ssValue + 1);

  if (!ssValue) {
  setOne;
  }
  else {
  setLast;
  }
  }

編集1

更新されたコード...空白のスプレッドシートでの最初の実行では、A1 = 1 と A2 = 2 が入力されます。セル A1 に 1 のみを入力し、その後インクリメントする必要があります。2回目以降は正常に動作します。考え?私は何が欠けていますか?function counter2() { //スプレッドシート、範囲、および範囲内の最初のセルの値を取得します var sSheet = SpreadsheetApp.getActiveSheet(); var ssRange = sSheet.getRange(1,1,1,1); var ssValue = ssRange.getValue();

  //will set value of first cell to 1 if null, undefined, false, 0, NAN etc.. (runs in if statement)
  var setOne = ssRange.setValue(1);

  //This goes back and get the range, lastrow of range, and value of first cell in range of last row & adds 1 to that value
  var lastRow = sSheet.getLastRow();
  var startValue = sSheet.getRange(lastRow,1,1,1).getValue();
  var setLast = sSheet.getRange(lastRow+1,1,1,1).setValue(startValue + 1);      

  if (!ssValue) {
  setOne;
  }
  else {
  setLast;
  }
  }

編集 2 - 修正済み

これは、正常に動作するように見える更新されたコードです。変数「lastRow、startValue、setLast」を 2 番目のステートメントの else ステートメントに移動しました。なぜそれが問題になるのでしょうか?それは変数を取得したときに実行し、 if / else {} ブラケットでラップすることにより、そのステートメントが実行された場合にのみ実行されるためですか?

function counter2() {
  //Get the spreadsheet, range, and value of first cell in range
  var sSheet = SpreadsheetApp.getActiveSheet();
  var ssRange = sSheet.getRange(1,1,1,1);
  var ssValue = ssRange.getValue();

  //will set value of first cell to 1 if null, undefined, false, 0, NAN etc.. (runs in if statement)
  var setOne = ssRange.setValue(1);  

  if (!ssValue) {
  setOne;
  }
  else {

  //This goes back and get the range, lastrow of range, and value of first cell in range of last row & adds 1 to that value
  var lastRow = sSheet.getLastRow();
  var startValue = sSheet.getRange(lastRow,1,1,1).getValue();
  var setLast = sSheet.getRange(lastRow+1,1,1,1).setValue(startValue + 1); 
    setLast;
  }
  }
于 2013-03-13T22:21:13.793 に答える