Почему функция submitData не добавляет поля на указанный лист? - PullRequest
0 голосов
/ 27 марта 2020

Я совершенно новичок в этом. Я видел скрипт для ввода данных без форм. Я следовал сценарию, предложенному в другом месте, но он не обновляет значения в указанном листе. Может ли проблема с форматированием в таблице? я должен прикрепить файл?

    function submitData() {
  var ss        = SpreadsheetApp.getActiveSpreadsheet();
  var formSS    = ss.getSheetByName("New Data"); //Data Entry Sheet
  var datasheet = ss.getSheetByName("Business Info"); //Business Info Data Sheet

  //Input Values
  var values = [[formSS.getRange("B3").getValue(),
                 formSS.getRange("B4").getValue(),
                 formSS.getRange("B5").getValue(),
                 formSS.getRange("B6").getValue(),
                 formSS.getRange("B7").getValue(),
                 formSS.getRange("B8").getValue(),
                 formSS.getRange("B9").getValue(),
                 formSS.getRange("B10").getValue(),
                 formSS.getRange("B11").getValue(),
                 formSS.getRange("B13").getValue(),
                 formSS.getRange("B14").getValue(),
                 formSS.getRange("B15").getValue(),
                 formSS.getRange("B16").getValue(),
                 formSS.getRange("B17").getValue(),
                 formSS.getRange("B18").getValue(),
                 formSS.getRange("B19").getValue(),
                 formSS.getRange("B20").getValue(),
                 formSS.getRange("B21").getValue(),
                 formSS.getRange("B23").getValue(),
                 formSS.getRange("B24").getValue(),
                 formSS.getRange("B25").getValue(),
                 formSS.getRange("B26").getValue(),
                 formSS.getRange("B27").getValue(),
                 formSS.getRange("B28").getValue(),
                 formSS.getRange("B29").getValue(),
                 formSS.getRange("B30").getValue(),
                 formSS.getRange("B31").getValue(),]];

  datasheet.getRange(datasheet.getLastRow()+1, 1, 1, 27).setValues(values);

}

function clear1() {
  var sheet = SpreadsheetApp.getActive().getSheetByName("New Data");
  var rangesToClear = ["B3","B4","B5","B6","B7","B8","B9","B10","B11","B13","B14","B15","B16","B17","B18","B19","B20","B21","B23","B24","B25","B26","B27","B28","B29","B30","B31"];            
  for (var i=0; i<rangesToClear.length; i++) { 
    sheet.getRange(rangesToClear[i]).clearContent();
  }
}

function onEdit(e) {
  e.source.setActiveSelection(e.range.offset(1, 0));
}

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Вам не нужно получать диапазон каждой ячейки. Вы можете просто указать диапазон из нескольких ячеек и использовать getValues ​​() . Это вернет двумерный массив, который можно преобразовать в одномерный массив с помощью map () или flat () . Этот последний метод используется в приведенном ниже примере:

function submitData() {
  const ss        = SpreadsheetApp.getActiveSpreadsheet();
  const formSS    = ss.getSheetByName("New Data");
  const datasheet = ss.getSheetByName("Business Info");
  const values = formSS.getRange("B3:B31").getValues().flat();
  datasheet.getRange(datasheet.getLastRow() + 1, 1, 1, values.length).setValues([values]);
}

Используя values.length, вы можете задать для целевого диапазона динамическое число столбцов c в зависимости от входного диапазона.

Вы также можете значительно упростить свою функцию clear1, выполнив следующее:

function clear1() {
  var sheet = SpreadsheetApp.getActive().getSheetByName("New Data");
  var rangeToClear = "B3:B31";
  sheet.getRange(rangeToClear).clearContent();
}

Ссылка:

0 голосов
/ 27 марта 2020

Вы можете сделать это следующим образом:

function submitData() {
  const ss=SpreadsheetApp.getActive();
  const fsh=ss.getSheetByName("New Data");
  const frg=fsh.getRange(1,2,31,1);
  const vs=frg.getValues();
  const dsh=ss.getSheetByName("Business Info");
  const out=new Set([1,2,12,22]); 
  let values=vs.map(function(r,i){if(!out.has(i+1))return r;}).filter(function(e){return e;});
  dsh.getRange(dsh.getLastRow()+1,1,1,27).setValues(values);
  //clear1();
}

function clear1() {
  var sheet = SpreadsheetApp.getActive().getSheetByName("New Data");
  var rangesToClear = ["B3","B4","B5","B6","B7","B8","B9","B10","B11","B13","B14","B15","B16","B17","B18","B19","B20","B21","B23","B24","B25","B26","B27","B28","B29","B30","B31"];            
  for (var i=0; i<rangesToClear.length; i++) { 
    sheet.getRange(rangesToClear[i]).clearContent();
  }
}

function onEdit(e) {
  const sh=e.range.getSheet();
  if(sh.getName()!="New Data")return; 
  e.source.setActiveSelection(e.range.offset(1, 0));
}//I'm guessing your doing this to get the cursor to move down after every entry but you will have problems on rows 12 and 22

И затем вы можете создать и установить кнопку отправки, как показано здесь . Я предполагаю, что вы хотите запустить функцию submitData (), когда вы нажимаете кнопку и, возможно, добавляете команду для вызова clear1 в конце submitData (). Вы также можете использовать боковую панель для создания html кнопок, которые могут делать то же самое, но они используют google.script.run для вызова любой функции на сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...