質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

4752閲覧

Google Apps Script において「値のみ貼り付け」が反映されない

happy9235

総合スコア1

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2020/10/14 00:45

編集2020/10/14 02:51

前提・実現したいこと

Google Apps Script で「値のみ貼り付け」をしたい。

発生している問題・エラーメッセージ

スクリプトを実行時にエラーは出ず、「スクリプトを実行しました」と表示されるものの、
貼り付けを指定した列は空白のままになっている。

該当のソースコード

var sheet = SpreadsheetApp.getActiveSheet()
var range = sheet.getRange('M:M');
var target = sheet.getRange('N:N');
range.copyTo(target, {contentsOnly:true});
};

試したこと

他のサイトも参考に複数のパターンを試してみましたがすべて同じ現象が起きました。

補足情報(FW/ツールのバージョンなど)

function myFunction() { //ソート・星式コピー var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('H4').activate(); var criteria = SpreadsheetApp.newFilterCriteria() .setHiddenValues(['××', '××', '××', '××', '××', '××', '××']) .build(); spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(8, criteria); spreadsheet.getCurrentCell().offset(40, 2).activate(); var destinationRange = spreadsheet.getActiveRange().offset(0, 0, 530); spreadsheet.getActiveRange().autoFill(destinationRange, SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES); spreadsheet.getCurrentCell().offset(0, 0, 530, 1).activate(); spreadsheet.getRange('H4').activate(); criteria = SpreadsheetApp.newFilterCriteria() .setHiddenValues([]) .build(); spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(8, criteria); spreadsheet.getRange('G4').activate(); criteria = SpreadsheetApp.newFilterCriteria() .setHiddenValues(['××', '××']) .build(); spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(7, criteria); spreadsheet.getCurrentCell().offset(1, 3).activate(); destinationRange = spreadsheet.getActiveRange().offset(0, 0, 530); spreadsheet.getActiveRange().autoFill(destinationRange, SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES); spreadsheet.getCurrentCell().offset(0, 0, 530, 1).activate(); spreadsheet.getRange('G4').activate(); criteria = SpreadsheetApp.newFilterCriteria() .setHiddenValues([]) .build(); spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(7, criteria); //列挿入 var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('I:I').activate(); spreadsheet.getActiveSheet().insertColumnsAfter(spreadsheet.getActiveRange().getLastColumn(), 2); spreadsheet.getActiveRange().offset(0, spreadsheet.getActiveRange().getNumColumns(), spreadsheet.getActiveRange().getNumRows(), 2).activate(); var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('L:L').activate(); spreadsheet.getActiveSheet().insertColumnsAfter(spreadsheet.getActiveRange().getLastColumn(), 2); spreadsheet.getActiveRange().offset(0, spreadsheet.getActiveRange().getNumColumns(), spreadsheet.getActiveRange().getNumRows(), 2).activate(); var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('O:O').activate(); spreadsheet.getActiveSheet().insertColumnsAfter(spreadsheet.getActiveRange().getLastColumn(), 2); spreadsheet.getActiveRange().offset(0, spreadsheet.getActiveRange().getNumColumns(), spreadsheet.getActiveRange().getNumRows(), 2).activate(); //数式入力・オートフィル・値コピー var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('J5').activate() .setFormula('=MAXIFS(I:I,D:D,D5)'); spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('J5:J538'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES); spreadsheet.getRange('K5').activate(); spreadsheet.getRange('J5').copyTo(spreadsheet.getActiveRange(), {contentsOnly:true}); var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('M5').activate() .setFormula('=SUMIFS(L:L,D:D,D5)'); spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('M5:M538'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES); spreadsheet.getRange('N5').activate(); spreadsheet.getRange('M5').copyTo(spreadsheet.getActiveRange(), {contentsOnly:true}); var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('P5').activate() .setFormula('=MAXIFS(O:O,D:D,D5)'); spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('P5:P538'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES); var sheet = SpreadsheetApp.getActiveSheet() var range = sheet.getRange('M:M'); var target = sheet.getRange('N:N'); range.copyTo(target, {contentsOnly:true}); };

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sawa

2020/10/14 02:22

記載されてるコードは問題なさそうなので、その他の部分に原因があるのかなと思います。 基本的な部分の確認ですが、 やりたいことは、開いているスプレッドシートの M列をコピーして N列に値を貼付けですよね? このコードは 開いているスプレッドシートのエディタに記述されてるんですよね?
happy9235

2020/10/14 02:30 編集

ご回答ありがとうございます。 やりたいことは、開いているスプレッドシートの M列をコピーして N列に値を貼付けです。 このコードは開いているスプレッドシートのエディタに記述してます。 同エディタに列を追加、関数入力のコードの記述に続き、「値を貼付け」のコードを記述しているのですが「値を貼付け」のみ反映されませんでした。この部分を純粋なコピペのコードで置き換えると数式はコピペできるようでした。
sawa

2020/10/14 02:41

なんとなく状況理解できました。 個人情報的な部分は xxx等で伏せていただいて、実行してる コードをフルに記載いただけますか。 その際 コードは <CODE>ボタン使っていただくと見やすいです。
happy9235

2020/10/14 02:52

上の補足情報にコードのフルを追記いたしました。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

前半のフィルタのあたりは、こっちで検証できないのですが、最後の値を貼付けの手前までは希望通りの動作ということであれば、数式を入れた後の「スプレッドシートの更新」の処理を加えてあげると解決しそうな気がします。

負荷を軽減する為なのか、GAS実行中は処理が全て完了するまで スプレッドシートが更新されないようです。

今回のような 数式貼付け → 計算結果を値として 他のセルに貼付け

をやろうとすると、計算が動く前の状態(空欄)を取得して貼り付けてしまいます。

参考
https://culage.hatenablog.com/entry/20170310/1489071600

ということで、最後の値貼付けのコード手前に

SpreadsheetApp.flush();

って記述を追加してみてください。

ちなみにマクロ記録からコードをおこしたからか、何度も var spreadsheet = SpreadsheetApp.getActive();が登場しますが、最初の1回だけでいいと思います。処理速度が多少は改善されるかと。

投稿2020/10/14 04:19

sawa

総合スコア3002

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

happy9235

2020/10/15 05:32

ありがとうございます! 解決致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問