Автонумерация в Google Таблицах с помощью скрипта приложений - PullRequest
1 голос
/ 04 августа 2020

В настоящее время я работаю с Google Forms и Appsheet, чтобы создать приложение для отслеживания жалоб для моей компании. Этот проект требует, чтобы каждая жалоба, отправляемая через Google Form, имела ComplaintID. Формат этого ComplaintID - текущий год, а затем номер жалобы (например, 2020-001 будет первой жалобой, полученной в 2020 году). Согласно спецификациям этого проекта, ведущие нули обязательны. Временная метка фиксирует год, поэтому присутствуют все необходимые данные.

Вот сценарий, который я нашел на howtogoogleapps.com, который, кажется, почти работает:

function addAutoNumber() {
  var sheet = SpreadsheetApp.getActive().getSheetByName("Form responses 1");
  // Get the last row that has content.
  var LastRow = sheet.getLastRow();
  // Set the first Auto Number
  var AutoNumberStart="2020-001";
 
  //---- First run ------------
  
  //Check if the first column is Timestamp
  if (sheet.getRange(1, 1).getValue() == "Timestamp") {
    // insert a column to the left and the text "ComplaintID" in the first row
    sheet.insertColumnBefore(1);
    sheet.getRange(1, 1).setValue("ComplaintID");
    // Fix for (probably) a bug that formats the new column 
    // with the same format of the column used to insert it,
    // in this case the column gets the date format like the Timestamp column.
    // So we set the format to number
    sheet.getRange("A2:A").setNumberFormat(0); 
    // check if there are already form responses and add numbers for them
    if (LastRow>1) {
      for(var ii=2; ii <= LastRow; ii++) {
        sheet.getRange(ii, 1).setValue(AutoNumberStart);
        AutoNumberStart="2020-"+ (parseInt(AutoNumberStart.substr(5,3)+1));
      }
    }
  }
  
  // ---- Add new Auto Number ----------
  
  // Check if there is a Number in the AutoNumber column 
  // for the last Form Submission
  if (sheet.getRange(LastRow, 1).isBlank()) {
  // Check if it is the first Form submission and set the AutoNumberStart
    if (LastRow == 2) {
      sheet.getRange(LastRow, 1).setValue(AutoNumberStart);
    } else {
      // Get the Last AutoNumber from the previous row
      var LastAutoNumber = sheet.getRange(LastRow-1, 1).getValue();
      // Set the next AutoNumber
      sheet.getRange(LastRow, 1).setValue("2020-"+ (parseInt(LastAutoNumber.substr(5,3)+1)));
    }
  }
}

Однако возвращаются 2020-001, 2020-11, 2020-111, 2020-1111, 2020-1111, et c. Не совсем то, что мне нужно. Если вы можете мне с этим помочь, я буду ВЕЧНО благодарен!

1 Ответ

1 голос
/ 04 августа 2020

В этом случае я думаю, что parseInt необходимо использовать для AutoNumberStart.substr(5, 3). Потому что AutoNumberStart.substr(5, 3) - это строковый тип. Поэтому, когда используется parseInt(AutoNumberStart.substr(5,3)+1), 1 добавляется к AutoNumberStart.substr(5,3) как строка. Думаю, что в этом причина вашей проблемы. Поэтому, чтобы избежать этого, я хотел бы предложить следующую модификацию.

От:

AutoNumberStart="2020-"+ (parseInt(AutoNumberStart.substr(5,3)+1));

Кому:

AutoNumberStart = "2020-"+ ("00" + (parseInt(AutoNumberStart.substr(5, 3), 10) + 1)).slice(-3);
  • Когда AutoNumberStart - это 2020-001, в данной модификации parseInt(AutoNumberStart.substr(5, 3), 10) - это 1 номера. И ("00" + (parseInt(AutoNumberStart.substr(5, 3), 10) + 1)).slice(-3) это 002.

Тестирование:

const AutoNumberStart1 = "2020-001";
const res1 = "2020-"+ ("00" + (parseInt(AutoNumberStart1.substr(5, 3), 10) + 1)).slice(-3);
console.log(res1)

const AutoNumberStart2 = "2020-099";
const res2 = "2020-"+ ("00" + (parseInt(AutoNumberStart2.substr(5, 3), 10) + 1)).slice(-3);
console.log(res2)

Примечание:

  • Если вы хотите использовать число более 1000 (более 4 цифр), как насчет следующей модификации ? В этом случае возвращается 2020-1000.

      const AutoNumberStart = "2020-999";
      const value = (parseInt(AutoNumberStart.substr(5, 3), 10) + 1).toString();
      const res = "2020-"+ ("00" + value).slice(-(value.length > 3 ? value.length : 3));
      console.log(res)
    

Ссылки:

...