2

在过去的几天里,我发布了几个关于我正在开发的 Google Apps Script Web App 的问题。到目前为止,这里的 Serge 非常有帮助。该脚本的帖子在这里

我希望在该脚本中添加一列以生成一个 uniqueID 计数器,以便在提交新表单时,计数器将看到以前的 uniqueID 并递增 1。想法将是带有标题行的空白电子表格。脚本在表单提交时运行,看到 A2 为空白并插入 1。下一个提交的表单将看到 A2 中的 2 添加 1 并将 3 放入 A3 等等。

现在我正在处理计数器,将单元格中的数字加 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

好的..我已经更新了我的代码并遇到了一个问题,我希望有人能提供帮助。该脚本将看到电子表格是空白的,并在 A1 中插入一个 1。在下一次运行时,它将看到 1 在 A1 中,并在 A2 中添加 1 和插入 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,然后在此之后递增。第二次运行时它工作正常。想法?我错过了什么?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”移动到第二个语句的 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 回答
0

您也可以使用ScriptProperties来管理唯一 ID。它更可靠,更容易使用。

可靠性说明:假设您的电子表格出现故障,并且您的 ID 为 [1,2,3,5,4]。然后,您的脚本将插入 5 作为下一个 ID。ScriptProperties 在跟踪最大数量方面做得更好。

> 样品使用

var uid = ScriptProperties.getProperty("last_unique_id")+1;
ScriptProperties.setProperty("last_unique_id",uid); //the current UID is now the "last UID"
//do something with the unique_id

当然,您必须首先设置属性。我建议您使用从菜单中运行的一个小功能来执行此操作。

function setUIDOnce() {
  ScriptProperties.setProperty("last_unique_id",1);
}
于 2013-03-14T01:42:52.153 回答