我的代码有(至少)2个问题。有人可以提供建议吗?我正在尝试学习JavaScript,所以我更喜欢提示,而不是完成代码。我的目标是将表单Main
复制到名为achievement
的新工作表中,并删除第一行中没有单词achievement
的所有列。
function myFunction() {
SpreadsheetApp.getUi().alert('STARTED');
var search_term='achievement';
var main=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Main');
var cp=SpreadsheetApp.getActiveSpreadsheet().insertSheet(search_term);
SpreadsheetApp.getUi().alert(main.getName()+':'+cp.getName());
main.copyTo(cp);
var values = cp.getDataRange().getValues();
var cell='';
try{
//n=1 skip first col because it has titles as well as the first row
for(n=1;n<values.length;++n){
cell = values[0][n] ; // 0 is the index of the first row.
if(!cell.indexOf('achievement')>-1)
{
cp.deleteColumn(n);
values = cp.getDataRange().getValues();
n=1
}
}
}catch(e)
{
SpreadsheetApp.getUi().alert(e+'val:col:'+cell+':'+n);
}
SpreadsheetApp.getUi().alert('DONE');
}
答案 0 :(得分:0)
values
的内容是一个二维数组,一个行数组,每个行都是一个单元格(或列)数组。您选择的循环范围与此数据的结构不匹配:
for(n=1;n<values.length;++n){
下一行的代码相当于双重否定:
if(!cell.indexOf('achievement')>-1)
...所以它会删除错误的列。请记住,当目标字符串不存在时,indexOf()
将返回-1
。
说到删除列,请考虑以下事项:
cp.deleteColumn(n);
您正在查看预先获取的数据,以确定要删除的列,并从电子表格中删除它们。删除列时,已删除列右侧的所有列都将获得新的列索引。换句话说,预取数组和电子表格列之间的+/- 1关系会发生变化。
你可以通过循环而不是向上来避免这种情况。
否则,请尝试逐步调试调试器中的每一行,验证电子表格中的更改。您的新工作表看起来应该由main.copyTo(cp);
填充,因此请先检查一下。
答案 1 :(得分:0)
尝试这种方式:
function testFunction()
{
var search_term = 'achievement';
var mainsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Main');
//make a copy of the main sheet and set a name.
var values = mainsheet.getDataRange().getValues();
var columns = mainsheet.getDataRange().getNumColumns();
//Check for each cell value and take the column numbers to an array.
// Instead of deleting each column from the sheet evrytime in the loop, try modifying the array and then update the sheet with those values one time.
}
如果你愿意,我可以提供工作代码。
希望有所帮助!