按 header 值删除列将删除所有列
deleting column by header value deletes all columns
我的代码有(至少)2 个问题。谁能提供建议?我正在努力学习 JavaScript 所以我真的更喜欢提示而不是完整的代码。我的目标是将 sheet Main
复制到一个名为 achievement
的新 sheet 中,并删除第一行中没有单词 achievement
的所有列。
它不会将 sheet Main 的值复制到 sheet 成就(我在成就中留下了空白文档。
当我手动粘贴数据时,代码会删除每一列(而不是不包含成就一词的列)
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
的内容是一个二维数组,一个行数组,每一行都是一个单元格(或列)数组。您选择的循环范围与此数据的结构不匹配:
for(n=1;n<values.length;++n){
下一行包含相当于双重否定的代码:
if(!cell.indexOf('achievement')>-1)
...所以它会删除错误的列。请记住,当目标字符串不存在时,indexOf()
将 return -1
.
说到删除列,考虑一下:
cp.deleteColumn(n);
您正在查看预取数据以确定要删除的列,并将它们从分布中删除sheet。删除列时,被删除列右侧的所有列都会获得新的列索引。换句话说,预取数组和 spreadsheet 列之间的 +/-1 关系发生了变化。
您可以通过向下循环而不是向上循环来避免这种情况。
否则,请尝试单步执行调试器中的每一行,验证分布的更改sheet。看起来你的新 sheet 应该由 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.
}
如果你需要,我可以提供工作代码。
希望对您有所帮助!
我的代码有(至少)2 个问题。谁能提供建议?我正在努力学习 JavaScript 所以我真的更喜欢提示而不是完整的代码。我的目标是将 sheet Main
复制到一个名为 achievement
的新 sheet 中,并删除第一行中没有单词 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
的内容是一个二维数组,一个行数组,每一行都是一个单元格(或列)数组。您选择的循环范围与此数据的结构不匹配:
for(n=1;n<values.length;++n){
下一行包含相当于双重否定的代码:
if(!cell.indexOf('achievement')>-1)
...所以它会删除错误的列。请记住,当目标字符串不存在时,indexOf()
将 return -1
.
说到删除列,考虑一下:
cp.deleteColumn(n);
您正在查看预取数据以确定要删除的列,并将它们从分布中删除sheet。删除列时,被删除列右侧的所有列都会获得新的列索引。换句话说,预取数组和 spreadsheet 列之间的 +/-1 关系发生了变化。
您可以通过向下循环而不是向上循环来避免这种情况。
否则,请尝试单步执行调试器中的每一行,验证分布的更改sheet。看起来你的新 sheet 应该由 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.
}
如果你需要,我可以提供工作代码。
希望对您有所帮助!