2016-04-13 3 views
0

私は、行と列とセルの配置が同じ2つのスケジュールを持っています。常に一定になるセルがありますが、フィールドが変更されるセルがあります。だから私は、2つの同一のシートの1つを呼び出すと、事前定義されたセルをクリアカスタムメニューのスクリプトを持っています。スクリプト側では、基本的に同じスクリプトを2回コピー/ペーストし、アクティベートシート名を変更しました。しかし、私はそのように重複しているように感じる。私はただ1つのスクリプトを持つことができる方法はありますか、私はそれを選択したメニュー項目に応じて、適切なスケジュールを拭くでしょうか?googleスクリプトをよりコンパクトにする(コンテンツを消去するためのスクリプト)

このカスタムメニュースクリプト

function resetsheetbutton() { 
    var ui = SpreadsheetApp.getUi(); 
    ui.createMenu('Advanced Menu') 
    .addSubMenu(ui.createMenu('Reset Schedule') 
      .addItem('Schedule 1', 'resetschedule1') 
      .addSeparator() 
      .addItem('Schedule 2', 'resetschedule2')) 
     .addToUi(); 
} 

これは、それが2 をスケジュールするためにポイントを除いてこれは、スケジュール2で同じ正確なスクリプトですスケジュールを一掃するためのスクリプト1

function resetschedule1(){ 
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 
SpreadsheetApp.setActiveSheet(spreadsheet.getSheetByName('Notification')); 
    var sheet = spreadsheet.getActiveSheet(); 
    var spreadsheet1 = SpreadsheetApp.getActiveSpreadsheet(); 
SpreadsheetApp.setActiveSheet(spreadsheet1.getSheetByName('Schedule 1')); 
    var sheet1 = spreadsheet1.getActiveSheet(); 
    var startRow = 2; 
    var lastRow = 80; 
    var range = sheet.getRange(2,11,lastRow-startRow+1,1); 
    var numRows = range.getNumRows(); 
    var reset = range.getValues(); 


for (var i = 0; i < numRows; i++) { 
var row = reset[i]; 
sheet1.getRange(row).clearContent(); 
} 
    sheet1.getRange('C3').setValue('Insert new Date here'); 
    sheet1.getRange('D3').setValue('Insert this week's task'); 
    sheet1.getRange('D29').setValue('Insert this week's task'); 
    sheet1.getRange('D55').setValue('Insert this week's task'); 
    sheet1.getRange('D81').setValue('Insert this week's task'); 
    sheet1.getRange('D107').setValue('Insert this week's task'); 
    sheet1.getRange('C6').setValue('=C5'); 
    sheet1.getRange('C25').setValue('=C5'); 
    sheet1.getRange('C32').setValue('=C31'); 
    sheet1.getRange('C51').setValue('=C31'); 
    sheet1.getRange('C58').setValue('=C57'); 
    sheet1.getRange('C77').setValue('=C57'); 
    sheet1.getRange('C84').setValue('=C83'); 
    sheet1.getRange('C103').setValue('=C83'); 
    sheet1.getRange('C110').setValue('=C109'); 
    sheet1.getRange('C129').setValue('=C109'); 
} 

です私はシートをアクティベートシートを一掃するのではなく、シートに具体的に名前を付けるので、スケジュールをクリアする人が間違ったスケジュールを誤ってクリアしないようにします。

function resetschedule2(){ 
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 
SpreadsheetApp.setActiveSheet(spreadsheet.getSheetByName('Notification')); 
    var sheet = spreadsheet.getActiveSheet(); 
    var spreadsheet1 = SpreadsheetApp.getActiveSpreadsheet(); 
SpreadsheetApp.setActiveSheet(spreadsheet1.getSheetByName('Schedule 2')); 
    var sheet1 = spreadsheet1.getActiveSheet(); 
    var startRow = 2; 
    var lastRow = 80; 
    var range = sheet.getRange(2,11,lastRow-startRow+1,1); 
    var numRows = range.getNumRows(); 
    var reset = range.getValues(); 


for (var i = 0; i < numRows; i++) { 
var row = reset[i]; 
sheet1.getRange(row).clearContent(); 
} 
    sheet1.getRange('C3').setValue('Insert new Date here'); 
    sheet1.getRange('D3').setValue('Insert this week's task'); 
    sheet1.getRange('D29').setValue('Insert this week's task'); 
    sheet1.getRange('D55').setValue('Insert this week's task'); 
    sheet1.getRange('D81').setValue('Insert this week's task'); 
    sheet1.getRange('D107').setValue('Insert this week's task'); 
    sheet1.getRange('C6').setValue('=C5'); 
    sheet1.getRange('C25').setValue('=C5'); 
    sheet1.getRange('C32').setValue('=C31'); 
    sheet1.getRange('C51').setValue('=C31'); 
    sheet1.getRange('C58').setValue('=C57'); 
    sheet1.getRange('C77').setValue('=C57'); 
    sheet1.getRange('C84').setValue('=C83'); 
    sheet1.getRange('C103').setValue('=C83'); 
    sheet1.getRange('C110').setValue('=C109'); 
    sheet1.getRange('C129').setValue('=C109'); 
} 

ご協力いただければ幸いです。

+0

コメントにもこの値を追加します。あなたは誰でも実行のスピードについてコメントすることができますか?現在、私はセル名の列を持っています(例えば、A2、D3:D5、E7など)は約80行です。私はループを通ってそれらを実行しています。実行には約25〜40秒かかります。私はその後、それをスピードアップするために配列関数を介してそれらを実行する間につまずいたが、それは速度で何もしなかった。それがシートを通過し、それらの細胞をより速くクリアするために私ができることは何もありませんか? – User125

答えて

0

メニューの機能はパラメータを含めることはできませんので、あなたはまだ、最初は二つの機能が必要になりますが、彼らは非常に短くなります。

function resetschedule1() { 
    resetschedule("1");//Pass the string value "1" to the function 
}; 

function resetschedule2() { 
    resetschedule("2");//Pass the value "2" 
}; 

あなたはその値を設定するためのオブジェクトを作成することができます両方のシートで同じです。 JavaScriptオブジェクトを使用すると、「キー」を「値」に一致させることができます。この場合、「キー」はセルアドレスになり、値は値になります。

var objCellToValueSameForBoth = { 
    "C3":"Insert new Date here", 
    "D3":"Insert this week's task" 
}; 

//Set the values that are the same in both sheets 
for (var key in objCellToValueSameForBoth) { 
    sheet.getRange(key).setValue(objCellToValueSameForBoth[key]); 
}; 

コードに異なる値を使用させる方法は複数あります。関数に値を渡すことができます。

function resetschedule(argWhichSheet) { 

    var objArgToSheetName = {"1":"Schedule 1","2":"Schedule 2"}; 
    var whichSheetToClear = objArgToSheetName[argWhichSheet]; 

    SpreadsheetApp.setActiveSheet(spreadsheet1.getSheetByName(whichSheetToClear)); 
}; 
+0

それは美しく働いて、私は何か新しいことを学んだ!ありがとうございました! – User125

+0

btw、あなたは実行のスピードについてコメントすることができますか?今私はセル名の列を持っています。 80行。私はループを通ってそれらを実行しています。実行には約25〜40秒かかります。私はその後、それをスピードアップするために配列関数を介してそれらを実行する間につまずいたが、それは速度で何もしなかった。それがシートを通過し、それらの細胞をより速くクリアするために私ができることは何もありませんか? – User125

+0

pleasefo関連のない第2の質問をしないでください。新しい質問をする。 –

関連する問題