我的代码至少有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');
}
values
的内容是一个2-d阵列,一个行数,每个阵列都是一个单元格(或列)。您选择的循环范围与此数据的结构不符:
for(n=1;n<values.length;++n){
这一行具有相当于双重负面的代码:
if(!cell.indexOf('achievement')>-1)
...因此它将删除错误的列。请记住,当不存在目标字符串时,indexOf()
将返回-1
。
谈到删除列,请考虑以下内容:
cp.deleteColumn(n);
您正在查看预取的数据,以确定要删除哪些列,并将其从电子表格中删除。删除列时,已删除的一个右侧的所有列都将获取新的列索引。换句话说,预取的阵列和电子表格列之间的/- 1关系更改。
您可以通过向下而不是向上循环避免。
否则,请尝试在调试器中的每一行逐步介绍,以验证电子表格上的更改。看起来您的新表应该由main.copyTo(cp);
填充,因此请先检查一下。
祝你好运!
尝试以这种方式:
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.
}
我可以提供工作代码。
希望有帮助!