为什么不是'功能子菜单数据将字段添加到指定的表格中



我对此完全陌生。我看到了一个没有表单的数据输入脚本。我遵循了其他地方建议的脚本,但它没有更新指定工作表中的值。数据表中的格式是否有问题?我应该附上文件吗?

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));
}

你可以这样做:

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((函数,并可能在submitData的末尾添加调用clear1的命令。您也可以使用侧边栏创建html按钮,这些按钮可以做同样的事情,但它们使用google.script.run来调用服务器上的任何函数。

您不需要获取每个单元格的范围。您可以指定一个多单元格范围并使用getValues((。这将返回一个2D数组,您可以使用map((或flat((将其转换为1D数组。最后一种方法用于以下样本:

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,可以使目标范围具有动态列数,具体取决于输入范围。

您还可以通过以下操作极大地简化函数clear1

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

参考:

  • Range.getValues((

最新更新