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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

873閲覧

GoogleAppsScript,ボタンを押したときのみ,任意の列の計算を更新

Por

総合スコア40

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/01/29 09:55

編集2022/01/29 23:14

追記内容

下記参照
qnoir様,ご指摘ありがとうございます.

現状

現コードでは添付の画像結果が出力されます.
イメージ説明

目的,ゴール

スクリプトによって
「ボタンを押したときのみ,任意の列の計算を更新する」
「C列配置のチェックボックスをTrueにし,かつ,値の貼り付けで完了,かつすでに貼り付けが完了している場合は更新しない」
を達成したいです.
このようにすることで,GoogleSheets再計算のたびにAPIリソースが消費されてしまうことを回避する
ことが目的です

エラー概要

図の例では,( K, 9 ), ( K, 10 )が翻訳されるはず,と期待しています.
1,
K列に計算結果を出力させたく,
"range"定義に合わせて
関数により(無理やり)範囲指定したものを実行させていますが,
エラーが発生しました.
GoogleTranslate関数の第1引数が範囲指定だから,ということが想定されます.
2,
なお,arrayformula関数で配列式も試しましたが,
GoogleTranslate関数は複数の対象を一つのセル内に出力するため,断念しました.

現コード

GAS

1// ボタンで指定セルに指定計算結果を, https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11157169156 2function click() { 3 var ss = SpreadsheetApp.getActiveSpreadsheet(); 4 var sh = ss.getActiveSheet(); 5 var range = sh.getRange('K2:K') 6 range.setFormula('=IF(C2:C=True, GOOGLETRANSLATE(H2:H, "en", "ja"), "")'); 7 range.setValue(range.getValue()) 8} 9 10

お聞きしたいこと

1, 回答者様が考えてらっしゃるベストプラクティス
2, 計算式だけの解決であれば計算式の修正
3, 計算式ではない点で修正が必要であれば

ご教授いただけたら幸いです.
ご返信お待ちしております.よろしくお願いいたします.

すでに頂いているご質問について

① 質問のコードで何かエラーが発生しているのでしょうか?
GoogleTranslate関数の第1引数が範囲指定だから,ということが想定されます.

②もしくは、 質問のコードでは、希望する動作にならないのでしょうか?
はい,希望する動作になっておりません.関数計算の結果が出力されることを希望しています.

1.今回制御対象とするのは、K列の2行目以降のセル(行数は不定)である。 >>> おっしゃるとおりでございます.
2.C列に手入力でデータが入っており、K列の各行は、C列の数値を使って計算した計算結果を表示する。 >>> おっしゃるとおりでございます.
3.ボタンを押したら、下記の動作を行うものとする。
_・「C列に値が入っているが、K列には値の入っていない"行"」に対して
__ =IF(C▲=True, 1, "") ※▲は各行番号
__ に該当する数式を設定する。(K列のうち、すでに値貼り付けとなっているセルには数式を設定しない) >>> おっしゃるとおりでございます.

4.各行に数式を設定した直後、数式設定したセルに対して、その計算結果を値貼り付けする。 >>>はい,計算結果が関数のままでないことを達成したいです.

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/01/29 11:51 編集

① 質問のコードで何かエラーが発生しているのでしょうか? →その場合は、エラーの内容を具体的に書いてください。 ②もしくは、 質問のコードでは、希望する動作にならないのでしょうか? →であるならば、希望する動作を「具体的に」書いてください。 現状の文とコードからは、希望されている具体的な動作がいまいちわかりません。 特に「任意の列」という表現や「値の貼り付けで完了,かつ次回以降は値の貼り付けされた行に関しては更新しない」の部分。これだけでは具体的な動作がはっきりわかりません。 コードからエスパーを発動させて読み解くに、たとえば、下記のような理解でよろしいでしょうか? 1.今回制御対象とするのは、K列の2行目以降のセル(行数は不定)である。 2.C列に手入力でデータが入っており、K列の各行は、C列の数値を使って計算した計算結果を表示する。 3.ボタンを押したら、下記の動作を行うものとする。 _・「C列に値が入っているが、K列には値の入っていない"行"」に対して __ =IF(C▲=True, 1, "") ※▲は各行番号 __ に該当する数式を設定する。(K列のうち、すでに値貼り付けとなっているセルには数式を設定しない) 4.各行に数式を設定した直後、数式設定したセルに対して、その計算結果を値貼り付けする。
Por

2022/01/29 23:14

① 質問のコードで何かエラーが発生しているのでしょうか? GoogleTranslate関数の第1引数が範囲指定だから,ということが想定されます. ②もしくは、 質問のコードでは、希望する動作にならないのでしょうか? はい,希望する動作になっておりません.関数計算の結果が出力されることを希望しています. 1.今回制御対象とするのは、K列の2行目以降のセル(行数は不定)である。 >>> おっしゃるとおりでございます. 2.C列に手入力でデータが入っており、K列の各行は、C列の数値を使って計算した計算結果を表示する。 >>> おっしゃるとおりでございます. 3.ボタンを押したら、下記の動作を行うものとする。 _・「C列に値が入っているが、K列には値の入っていない"行"」に対して __ =IF(C▲=True, 1, "") ※▲は各行番号 __ に該当する数式を設定する。(K列のうち、すでに値貼り付けとなっているセルには数式を設定しない) >>> おっしゃるとおりでございます. 4.各行に数式を設定した直後、数式設定したセルに対して、その計算結果を値貼り付けする。 >>>はい,計算結果が関数のままでないことを達成したいです. ご指摘ありがとうございます. 引き続きよろしくお願いいたします.
退会済みユーザー

退会済みユーザー

2022/01/29 23:36 編集

(最初の投稿時には画像は貼り付けられていませんでした) その状態で、当初の質問文から私の最初にイメージしていたものは下記のようなものです。 ・ボタンが1個ある。 ・そのボタンを1回押すと、K列の2行目以降の対象となる全行に対して、一括して更新処理及び値貼付処理を行う。 そうではなくて正確には、 ・1個のボタンと、C列の各行にチェックボックスがある。 ・チェックを入れてボタンを押したら、「C列チェックボックスにチェックが入っている行(のK列のセル)」のみ、数式を新規設定(すでに値貼付け済みとなっているセルは数式を再設定)し、計算後値貼り付けする。 ・一番最初はK列のどのセルにも数式が入っていなくて構わない このような理解で合っていますか?
Por

2022/01/30 01:06

そうではなくて正確には、 ・1個のボタンと、C列の各行にチェックボックスがある。 ・チェックを入れてボタンを押したら、「C列チェックボックスにチェックが入っている行(のK列のセル)」のみ、数式を新規設定(すでに値貼付け済みとなっているセルは数式を再設定)し、計算後値貼り付けする。 ・一番最初はK列のどのセルにも数式が入っていなくて構わない こちらがおっしゃるとおりでございます(数式は固定の予定です). 汲み取っていただきありがとうございます.
guest

回答1

0

ベストアンサー

御記載の通り、GOOGLETRANSLATE関数は、先頭行だけH2:Hのような書き方をしても複数行に対して適用できないようです。

下記コードでは、C列にチェックの入っている行について、K列に数式を設定し、直後に値貼り付けします。

(なお、2行目以降の対象行のA列~K列の中で列結合されている行が存在する場合、下記2つのコードは正しく動作しないことがあります)

js

1function myFunction1() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const sh = ss.getActiveSheet(); 4 const lastRow = sh.getRange('C:C').getLastRow(); 5 6 for (let i = 2; i <= lastRow; i++) { 7 // C列の値を取得 8 const check = sh.getRange('C' + i).getValue(); 9 // C列のうちチェックが入っている行の処理 10 if (check === true) { 11 // K列を数式に置き換える。 12 sh.getRange('K' + i).setFormula('=GOOGLETRANSLATE(H' + i + ', "en", "ja")'); 13 // K列を更新(値貼付) 14 sh.getRange('K' + i).setValue(sh.getRange('K' + i).getValue()); 15 } 16 } 17}

上のコードでは1行ずつ読み取って1行ずつ書き込んでいます。行数によっては、下のように一括して書き込む方が若干早いかもしれません。(なお、下のコードはチェックが入っていない行に数式が入っている場合も全部値貼り付けになります)

js

1function myFunction2() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const sh = ss.getActiveSheet(); 4 const range = sh.getRange('K2:K') 5 6 // C列の値を取得 7 const checks = sh.getRange('C2:C').getValues().flat(); 8 9 // C列のうちチェックが入っている行のインデックスを取得 10 const checkedIndices = checks.map((e, i) => e ? i : false).filter(i => i !== false); 11 12 // K列の現状の値を取得 13 const originalValues = range.getValues().flat(); 14 15 // K列のうち、C列にチェックが入っている行を数式に置き換える。チェックが入っていない行は元の値のまま。 16 const modifiedValues = originalValues.map((e, i) => 17 checkedIndices.includes(i) ? [`=GOOGLETRANSLATE(H${i + 2}, "en", "ja")`] : [e]); 18 19 // K列を更新(数式含む) 20 range.setValues(modifiedValues); 21 22 // K列を更新(全部値貼付) 23 range.setValues(range.getValues()); 24}

投稿2022/01/30 09:30

編集2022/01/30 10:32
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Por

2022/01/30 10:26

無事稼働いたしました.大変ありがとうございます.チェックを条件にして 1,For文で1行ずつ数式計算させる 2,インデックス取得させて数式計算させる 大変勉強になりました.
Por

2022/01/31 05:34

一点ご質問よろしいでしょうか. 私の方で確認が漏れておりましたが,「C列配置のチェックボックスをTrueにし,かつ,値の貼り付けで完了,かつすでに貼り付けが完了している場合は更新しない」の 完了している場合は更新しない(スキップする),の部分について ご教授いただくことは可能でしょうか. もしお気づきの際,お時間いただける際で結構です. いつでもご連絡お待ちしております.
Por

2022/01/31 06:37

※追記 私の方で試行錯誤してみました. 結果,現在未だうまくいっておりません. 修正点は,貼り付け列"F列"の値取得,値が空白である条件で分岐,頂いた関数の稼働,という内容になります. ``` function click(){ const ss = SpreadsheetApp.getActiveSpreadsheet(); const sh = ss.getActiveSheet(); const lastRow = sh.getRange('B:B').getLastRow(); for (let i = 2; i <= lastRow; i++) { const check = sh.getRange('B' + i).getValue(); const translated = sh.getRange('F:F'); if (translated.isBlank()){ if (check === true ){ sh.getRange('F' + i ).setFormula('=googletranslate(E' + i + ', "en", "ja")'); sh.getRange('F' + i ).setValue(sh.getRange('F' + i).getValue()); } } } } ``` 結果,関数が稼働しておりません. もしお気づきの際,お時間いただける際で結構です. いつでもご連絡お待ちしております.
退会済みユーザー

退会済みユーザー

2022/01/31 09:15

const translated = sh.getRange('F:F') これを const translated = sh.getRange('F' + i) に修正してみて下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問