Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

GASで毎月クエリしてくれるシートを作りたい

解決したいこと

GAS初心者です。
スプレッドシートで月次の進行管理表を作っています。
各シート名は202201, 202202, 202203,...のように月ごとになっています。

さらに各シートのA1セルにquery関数を入力し、importrange関数で他シートからデータを引っ張っています。

query関数のコードは

=QUERY(
IMPORTRANGE("*************", "202203!a:z"), 
"SELECT Col1, Col2 where Col1 = 'ペーパーカンパニー1'", 1)

のようなものです。

次の月が来た場合、このコードの202203を202204などと手作業で書き換えているのですが、シートの数(ペーパーカンパニー2,3,4・・・)が増えてきて、手作業も面倒になってきました。

GASのトリガーを使ってquery関数の入力を自動化したいのですが、何かいい方法がありますでしょうか。

GASのサンプルをググりコピペして、なんとか新しい月のシート202204を作るスクリプトは書けたのですが、上記コードの文字入力の自動化がうまくいかず困っています(エスケープ文字などが必要?)

関数、ライブラリなどヒントだけでもお知恵をお借りできればありがたいです。

0

3Answer

多分、ここで使用されているクォートが何故か全部全角文字なせいではないでしょうか。

- SELECT Col1, Col2 where Col1 = ペーパーカンパニー1’”
+ "SELECT Col1, Col2 where Col1 = 'ペーパーカンパニー1'"

これをセルに入力しているGASのコードも見せていただければ解決が早いかも知れません。

0Like

ご回答ありがとうございます。クオーテーションマークはコピペの関係かなにかで全角になっていました、すみません。半角に直しました。

実際に試してみたコードを個人情報を隠す形で書き直してみました。
他の方のコードのコピペを書き換えたものなのでところどころ変だと思います。

新月のシートのセルに簡単な文字列を転記するところまではできたのですが、Queryコードはエラーになってしまいます。GASの基本的なコードの書き方が分かっていない気がします。

お手数おかけし恐れ入りますがご教示いただけると幸いです。

//動作時の今月YYYY_MMのシートを複製する関数
function AutoSheetCopy(){
  
  //このプログラムが入っているスプレッドシートを操作する
  var ssActiveSheet = SpreadsheetApp.getActiveSpreadsheet(); 
  //今日の日付を取得する
  var datToday = new Date(); 
  //今月YYYYMMをつくる
  var datThisMonth = Utilities.formatDate(datToday,"JST","yyyyMM");
  //今日の年と月を取得する
  var todayYear = datToday.getFullYear();
  var todayMonth = datToday.getMonth();
  //翌月1日をつくる
  var datNextMonth1st = new Date(todayYear,todayMonth + 1,1);
  //翌月YYYYMMをつくる
  var datNextMonth = Utilities.formatDate(datNextMonth1st,"JST","yyyyMM");  
   
  //今月YYYYMMのシートを取得する
  var ssTemplateSheet = ssActiveSheet.getSheetByName(datThisMonth);
  //シートを複製し、できたシートの名前を翌月YYYYMMにする
  ssActiveSheet.insertSheet(datNextMonth, 0, {template: ssTemplateSheet}); 
  

  // //複製してできたシートのA1セルに、Queryコードを更新して記入したい。ここの202203を変数にするのが目標だが、まずは指定文字列でトライ。
  var sss = spreadsheet.getSheets()[0];
  var sst = ="QUERY(IMPORTRANGE("****************************", "202203!a:z"),"SELECT Col1,Col2,where Col7 = 'ペーパーカンパニー1'",1)";
  sss.getRange(1, 1).setValue(sst);
}
0Like

ここは構文エラーが出てますよね?

-  var sst = ="QUERY(IMPORTRANGE("****************************", "202203!a:z"),"SELECT Col1,Col2,where Col7 = 'ペーパーカンパニー1'",1)";
+  var sst = "=QUERY(IMPORTRANGE(\"****************************\", \"202203!a:z\"), \"SELECT Col1,Col2 where Col7 = 'ペーパーカンパニー1'\",1)";

//※又は
+  var sst = '=QUERY(IMPORTRANGE("****************************", "202203!a:z"), "SELECT Col1,Col2 where Col7 = \'ペーパーカンパニー1\'",1)';

エラー箇所

  • sst = =" (タイプミス?)
  • クォート('又は")で囲った文字列の中で同じ種類のクォートを使用する場合は直前にバックスラッシュ"\"(日本語環境では"¥"キー)が必要になります。
  • SELECT Col1,Col2,where (whereの前のカンマが余計)
0Like

Comments

  1. 回答ありがとうございます。おかげさまで無事望むスクリプトが実行できました!

    雑な投稿ですみませんでした。
    エラーのご指摘2番目の、エスケープシーケンスの作法の知識不足が原因でした。勉強になりました。
    ご縁がありましたらまたどうぞよろしくお願いいたします。

Your answer might help someone💌