結論
moveActiveSheet(Integer)で移動先の位置を指定しましょう。
function copySheet(){
//スプレッドシートを指定
var ss = SpreadsheetApp.getActiveSpreadsheet();
// コピー元シートを指定
var source = ss.getSheetByName("テンプレート");
// シートをコピー
var newSheet = source.copyTo(ss);
// シート名を「hoge」に変更
newSheet = newSheet.setName("hoge");
//作成シートにカーソルをフォーカス
ss.setActiveSheet(newSheet);
//カーソルフォーカスされた作成シートを左から2番目に移動
ss.moveActiveSheet(2);
}
解説
「シートの作成を自動化できたはいいものの、ピンポイントに設置したい!なのにどうすればいいかMethodが見つからない」というお問い合わせをいただきました。
「シートを増やすんだから、使うClassはSheetだよね」という読みは大正解。
だけどもシート移動はSpreadsheet ClassのMethodを使うことになります。
「Classを探すなら、やりたいことの補語1に該当するものを探せ」。
なおmoveActiveSheetは
- 今、カーソルが置いてある(Activeな)シートを
- 指定された位置に移動する
というMethodのため、「動かしたいシート(=たった今、スクリプトによって作成したシート)」を明示してあげる必要があります。
上記サンプルスクリプトではこれをsetActiveSheet(sheet)で実現しました2。
蛇足
今回のお題であればコピーしたシートの名前は「hoge」ではなく日付にしてあげた方が良いでしょう。
これも諸説ありますが私が書くとこんな感じ(というのをsample-code2.gsに載せておきます)。
動作確認スクリプト
//スプレッドシートを指定
var ss = SpreadsheetApp.getActiveSpreadsheet();
// スプレッドシート内にある「テンプレート」シートをコピーし、
// 「yyyy-MM-dd HH:mm」形式のシート名に変更したものを
// シートの一番右側に作成
var newSheet = ss.getSheetByName("テンプレート").copyTo(ss).setName(Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy-MM-dd HH:mm"));
//作成シートにカーソルをフォーカス
ss.setActiveSheet(newSheet);
//カーソルフォーカスされた作成シートを左から2番目に移動
ss.moveActiveSheet(2);
}
スクリプト補足1
sample-code1.gsの2〜4行目をまとめました(変数sourceの使い道が、変数newSheetの操作にしか使わなかったので)。
スクリプト補足2
setActiveSheetの返り値はSheet Classなので、うっかりsetCativeSheet(newSheet).moveActiveSheet(2)
とかやると実行時に怒られます。
moveActiveSheetもSpreadsheet Classだからね!
つぶやき1
「”〜に”の部分って目的語だっけ?補語だっけ?」と悩んで10分くらいGoogle検索に頼ってしまったのは内緒の話。