【MACRO】Google Apps Script 質問スレ【DRIVE】
Google Apps Script でのプログラミング等に関する質問スレです Excel や Access の VBA に不満のあるあなた web アプリだけでなくクライアントアプリからも利用したいあなた ローカルなデータベースやファイルだとバックアップに不安のあるあなた ム板に無かったので立ててみます Google Apps Script ttps://developers.google.com/apps-script/ Google Drive API ttps://developers.google.com/drive/ Getting Started with the Google Data Python Library ttps://developers.google.com/gdata/articles/python_client_lib ■関連スレ Google Maps API 質問箱 http://peace.2ch.net/test/read.cgi/tech/1131627583/ Microsoft SkyDrive API http://peace.2ch.net/test/read.cgi/tech/1385604796/ 【GoogleAppsScript】猿92【研究せよ!!!】 http://nozomi.2ch.net/test/read.cgi/php/1398600864/ GoogleAPIってどうよ? http://nozomi.2ch.net/test/read.cgi/php/1018614427/ Google App Engine for Python 6アプ目 http://nozomi.2ch.net/test/read.cgi/php/1358570953/ Google App Engine for java http://peace.2ch.net/test/read.cgi/tech/1317639323/ GoogleWebToolkit[GWT]について語ろう http://nozomi.2ch.net/test/read.cgi/php/1147975874/ Gmail時間予約送信のGmailApp実装はまだですか? トリガーも使ってます、定期送信用に。 ただ、不定期にspreadsheets上で複数宛先に一括送信する場合、毎回宛先も内容も違うので、念のため事前にgmail上でチェックしたいのです。 google driveやonedrive、amazon s3をFTPで利用できるアプリを開発しました。 よかったら使ってみてください。 webifi http://www.loxsols.com/pukiwiki/index.php?webifi Java Script知らない場合は先にJava Script勉強したほうがいいですか? でもES5の仕様がほとんど使えないから ちょい古めのJavaScriptで書くことになる ドキュメントにあるデータ名・URL・オーナー名・作成日・更新日を一覧化したいんだけど、指定したオーナーのデータのみ吐き出したい。 これってできる? スプレッドシートのonOpenで自分のホルダー名知りたいのですがdriveappの一部が仕様でエラーになります。何か裏技無いでしょうか? 自己解決、onOpenじゃなくて現在のプロジェクトのトリガーでスプレッドシートの起動時にvoldの関数を実行すると登録したら動きました。擬似的なフォルダ構造でやれそうです。 スプレッドシートの内容をカレンダーに自動追加するスクリプトを素人ながら作りましたが、 いわゆるAPIの呼び出し過多で実行時間が11-14秒かかります。 短縮するにはどのように書き直せばいいかご教示いただけないでしょうか。 function CreateEventfromSheet() { var sheet, i, event, date, added; sheet = SpreadsheetApp.getActiveSheet(); for(i = 2; i <= sheet.getLastRow(); i++) { added = sheet.getRange(i, 16).getValue(); if(added == "") { event = sheet.getRange(i, 11).getValue(); Logger.log(event) date = sheet.getRange(i, 12).getValue(); Logger.log(thedate) thisevent = CalendarApp.getCalendarById("*****") .createAllDayEvent( event, date ); sheet.getRange(i, 16).setValue("done"); } } } >>644 for文の前に、まるっとgetValue's' とか? >>645 あと、各行の結果も(二次元)配列に入れておいて最後に setValue's' かな インストール不要だからVBAより便利そうですね。 最近勉強を始めました。 >>644 結果を入力するとことか無駄あるけど、こんな感じかな ポイントはシートにセットする値は二次元配列にしないとだから、resultにpushするときに配列として渡してあげるとこ ただカレンダーの予定を入力するのは結局一つずつだから、大量に入れると遅くなるのは仕方ないかも A列 タイトル B列 日付 C列 イベント作成したかどうか function sample() { var sheet = SpreadsheetApp.getActiveSheet(); var calender = CalendarApp.getCalendarById('####'); var data = sheet.getDataRange().getValues(); // カレンダーへのセットの結果を格納する配列 var result = []; data.forEach(function(value){ if(value[2] === ''){ var title = value[0]; var date = new Date(value[1]); calender.createAllDayEvent(title, date); result.push(['done']); }else{ // すでにセットされている予定は更新しない result.push([value[2]]); }; }); sheet.getRange(1, 3, result.length, 1).setValues(result); } あけましておめでとうございます。 >>645 ,>>648 ありがとうございます。 結果的に下記内容で実行時間を1カレンダー入力を2秒未満に済ませることができました。 カレンダー追加済と日付の指定を探しに行く範囲を限定しただけですが... 前提となるシートの内容が、 上から順に案件番号(3列目,C列)と案件名(10列目)は振られるものの、 カレンダーへの反映は予定日(11列目)が決まり次第のため、 入力済かの判定列(15行目)は途中で空欄が含まれるものでした。 >>648 の内容をすることを正月休みの宿題にすることにします。 function CreateEventfromSheet2() { var sheet = SpreadsheetApp.getActiveSheet(); var lastRow = sheet.getLastRow() var columnC = sheet.getRange('C:C').getValues(); var lastRowC = columnC.filter(String).length;//案件番号の最終行 Logger.log(lastRowC) for(var i = 2; i <= lastRowC; i++) { var added = sheet.getRange(i, 15, lastRowC, 1).getValue();//カレンダー追加済か var thedate = sheet.getRange(i, 11, lastRowC, 1).getValue();//予定日が入力されているか if(added == "") { if(thedate !==""){ var event = sheet.getRange(i, 10).getValue(); Logger.log(event) thisevent = CalendarApp.getCalendarById("****") .createAllDayEvent( event, thedate ); sheet.getRange(i, 15).setValue("done");//追加済とする } } } } GASに、VBAのAdvancedFilter相当の機能はありますか? ORとANDの組み合わせが自由自在のやつ。 ↑出来れば、他の閲覧者の画面に影響しないタイプのフィルタで。 クエリ? 自シート内でフィルタではなく、他シート(または別範囲)に書き出す感じですか。 apps scriptでCSV読み込んでそれをgoogleドキュメントに差し込みしてそのあと印刷したいってできる? app script初回に他のアクセスするファイルの許可って途中からでも許可できるファイル増やせる? 豚切りスマソ ファイル名の同じpdfファイルを毎月同じ日にダウンロードして、Googleドライブに保存したいんだけど、そんなことできる? 例えばこれ https://www.mizuhobank.co.jp/market/pdf/mid/midcba.pdf GASで他人が作ったライブラリを追加したのですが、その内容を確認する方法はあるのでしょうか?あるのでしたらその方法を教えていただきたいと思います。 Twitterに投稿をするアプリの紹介している同人誌があり Authを設定してそのライブラリに渡すことで実現しています。 ただ、そのライブラリは作者が開発したのもですので、 抜き取られていないかどうかを確認したいと思っています。 今日初めてスプレッドシートでスクリプトを書き始めたド初心者です 変数にちゃんと値が入ってるか確認するためにLogger.log()でこまめにログを開くんですが、ログ表示にすごく時間がかかったり、スクリプトの中間辺りのLogger.log()だけ表示されていたりします 10〜20秒位待ってログを開き直すとちゃんと表示されるのですが、毎回待たされるのが地味にストレスです 素早く正しく表示させる方法はありますか? ちなみに変数に値を入れて、その中身を表示させるだけのシンプルなものでもそれなりに待たされます あとログウィンドウを移動させる際に、ウィンドウを持てる箇所の当たり判定が小さいのと、マウスカーソルが矢印から手に変わらないから、なかなか一発で動かせないのと、動かしたところでスクリプト画面にフォーカスしないからスクロール出来ないのも憎しみポイントですね >>664 新しいエンジンが供用開始になったばかりなのでまだ buggy かも ログ表示は旧エンジンを使えばすぐ表示される あんまり回答になってないが >>663 その作者が公開設定してなきゃ確認する手段はない 有名どころのライブラリは公開してるのがほとんどだから、あやしいマイナーライブラリ使うより有名なTwitterライブラリ使ったら? >>666 理解しました。アドバイスもありがとうございます。 有名なTwitterライブラリを探してみたいと思います。 >>667 だけど追加で報告 V8エンジンをオフにしてると、includesって命令使った時だけエラーが出ます if(!ran.includes(temp)) こう書いてある行でエラーになるけど、V8オフにすると問題無し ranもtempも直前でログ表示してますが、中身に問題はありません そしてまた質問なんですが、 特定のセルを変更した時だけスクリプトを走らせる事は出来ますか? onEditだとどのシートのどのセルいじってもファンクション呼んじゃう A1のセルでファンクションA、B1ならBを呼ぶ あるいは セルA1のプルダウンがAならA、BならBみたいにして、スマホからでも動かしたいんです 各シートは普通に手入力で修正追加する表計算として使いたいので、いちいちファンクション呼んでたらサーバーが地獄です htmlと絡めてwebアプリ的にするしか無いんですかね? >>669 includesはもとのGASではArrayオブジェクトにないからエラーになるのが通常動作 V8とオブジェクト単位で使える使えないがそもそも違うので、少しはリファレンス読んだ方が良いよ >>669 モバイル端末からはそもそもコンテナバインド型GASは実行できない 規約なり制限をきちんと読め スプレッドシートに紐づけしたGASって他のスプレッドシート参照できないんだな いい勉強になったわ、自動化する時はGAS単独で作るしかないな excelの何でもできる、痒いところに手が届くに慣れてると Googleスプレッドシートには絶望しかない >>674 どこまでいってもOpenDocument派生だからExcelより同じ派生のLibreOfficeにあるCalcが近しいから仕方ないかと >>677 いややってみたけど無理だったよ、スプレッドシートに紐づけしてるマクロの中で他のスプレッドシート開こうとしたら怒られたし権限がないって >>679 このコメントは間違いだった、ちゃんとアクセスできたわ 謝罪しておきます、スペルミスしてたのかなあopenByidでミスったか・・・ >>680 変更履歴から直近の変更点は確認できるし、今後も同じような事にならんようになにが原因でできてなかったのかは明確にしとくと自分自身のために良いよ cat テキスト | grep hogehoge 相当は テキスト.match(/.*hogehoge.*/g); でよさそうなのですが grep -v hogehogeに相当するのをGASでどう書けばいいのかわからないのですが、 どなたか教えてもらえないでしょうか Ruby なら、 text = <<"EOT" abc あいう xyz EOT re = /あい/ text.each_line do | line | # 1行ずつ処理する line.strip! # trim puts line unless line.match( re ) # マッチしなければ end 出力 abc xyz >>683 テキスト.match(/^(?!.*hogehoge.*).*$/gm); https://regex101.com/r/G4zn3F/1 GASでは試してないんだけど ES3でもnegative lookaheadには対応してたはず v8ならまず問題ない VBAスレで相手にされなくなったからって、GASスレまで出向いてこないでくださいな。 GAS極めようと思ったら、google cloud platformは必須かな? google cloud platformってなぁに? GCPとGASは別物 GCP使っててもGASは使わん事のほうが多い、逆も同じ GASでTwitterbot連動して投稿とかもうわけわかんねえ〜 >>691 GASでInstagram連携はめんどうだけど、Twitter連携は楽だろ 何故かツイートコメントに改行コード入れても改行されないし投稿時間は毎回変える感じだったら、改行なんてツイッターの中で何が改行コードなのかわからねえし参考になる記事見て同じコードで解決にならなかったわ >>693 TwitterのTweetで渡す文字は一般的な改行コードしか存在しない 特別なものなんて使われてないから単純に文字列操作できてないだけかと >>694 なるほど、\nで改行したいって言ってたけど理論上無理だったのか 改行コードは、 Windows なら、\r\n Linux なら、\n HTML なら、br タグ。<br> GASはJavaScript使えるからVBより好きなんだけど、スマホで編集・実行出来ないのが辛い 定期的に居るけど、そこまでスマホでプログラムを編集実行するか? プログラム書くのにスマホでとか効率悪すぎだろ VBAと比べてどうですか? 細かい事やろうとするとやはりVBAじゃないとできないかな〜と思ってます。 ただ、利用者環境にOfficeのインストールの手間がかからない事を考えると 今後はGoogleスプレッドシートが一番なのかな VBAは蕁麻疹出るけど GASは掻いてて気持ち良い だがどんな場合でもGASが勝ってるかと言えばそうでもない >>701 JavaScriptは慣れてますが GASは初めてです。 おすすめの学習サイトがあったら教えてください。 インストールの手間が要らないので今後は、Googleスプレッドシートが覇権をとると思います。 >>699 「プログラム」レベルの編集は流石に誰も望まないだろ 拷問だぞw ちょっと出先でスクリプトの修正が出来ればいいんだよ そしてスマホでスクリプトの編集が出来ない=何かあった時に対応出来ないからって理由なのか、スマホでマクロが動かないのは普通に不便じゃない? >>702 スプレッドシートとの連携でGAS使いたいならやりたい事次第で覚え方変わるかと V8に対応したいなら本家リファレンス1択 巷に出回ってるのは旧バージョンでの解説 GASはJavaScriptより使えるオブジェクトが絞られてたり構文の書き方が微妙に違ったりするから、変に嵌らないためにはどっち選んでも本家リファレンスは読むべき >>704 > 構文の書き方が微妙に違ったりする これマジですか? 何で微妙に違う必要があるんだろうな。 VBAとVBSもそう。 微妙に違うことに何のメリットがあるのか。 >>704 ありがとうございます。 VBAと比べる出来る事は限られて来るとは思いますが やはり便利なので地道に学習していきます。 >>706 VBAはVB6派生でVBSとはもともと設計から違うから、その2つは比較するもんではない 設計を分ける必要があったの? 完全に同じか、全然違うならわかるが、 8割くらい似せるって何の意味があるんだろう。 質問 gasでpwa作れますか?アイコンとかどうすればいいの?sw.jsは? >>710 PWAは簡単にできる アイコンなんかは設定から好きにできる sw.jsも使える Google Formで条件分岐した先の選択肢をSpread Sheetから読み込んでFormを自動作成することってできます? できそうなら方法を教えていただきたいです 具体的には設問1はプルダウンで47都道府県を回答させてそれに応じて設問2は分岐 設問2は東京の人なら東京に関しての設問をSpread Sheetから読み込ませて作成するイメージです google drive で、あるフォルダの中に同じ名前のサブフォルダが沢山ある場合にそれらを結合してくれるスクリプトを作りたいんですが、参考になる記事などありませんでしょうか? サブフォルダa サブフォルダa サブフォルダa サブフォルダb サブフォルダb を サブフォルダa サブフォルダb にしたいです。サブフォルダたちの中身は消さずに移動させたいです。 1つのフォルダ内に、同じ名前のサブフォルダが2つ以上作れるの? そんなファイルシステムを見た事がない >>716 ラベルみたいな感じだから、フォルダ名もファイル名も重複可能なのよ 1つのファイルを(シンボリックリンクではなく)複数フォルダに格納したりもできるので、普通のファイルシステム感覚で使うと戸惑うことがある フォルダ名もファイル名も当てに出来ない 頼りになるのはIDだけ しかもIDには階層構造が無いω >>715 どストライクな回答ありがとうございます。 私がやりたいことそのもののようなので、 後ほどじっくり読んでトライしてみます。 >>714 です 毎月同じ名前のフォルダをGoogleドライブにアップロードすると、同じ名前のフォルダが2つずつできてしまい困っていたため、このような質問に至りました。 このスクリプトを作って実験してみようも思い、 同じ名前のフォルダを複数アップロードしようとすると、「更新しますか?」というメッセージが出てきて、「更新」を選ぶと、重複なくファイルやフォルダがアップロードされました。 したがってスクリプトは不要になってしまいました。 私の記憶だと以前は特に尋ねられることもなく、同じ名前のフォルダやファイルが二重に出来てしまっていた気がするのですが、、、、改善されたんですかね? Googleフォームの回答スプレッドシートで、回答上限数を設けたいです。 function myFunction() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getActiveSheet(); var value = sheet.getRange("N2").getValue(); if(value >= 4) { form.setAcceptingResponses(false); } } N2にSUMIFでの計算結果を入れています。 上記スクリプトでif(value >= 4) { でエラーが出てしまいます。 どうしたらSUMIFの結果であるN2が「4」以上になったらフォームを閉じることが出来るのでしょうか? spreadsheetで、セルの罫線の設定有無を取得したいのですが、 setBorder()はあってもgetBorder()が見当たりません 罫線の有無を取得する方法は何かありませんか >>724 ありがとうございます! 英語は不得手ですが、読みながら試してみたいと思います GASを今日知ったレベルですが 複数1000件程度のpdfファイルがあります。 そのタイトルを一気に1つのスプレッドシートに入れることはできますか? 可能であればそのフォルダの階層別のタイトルも入るのがベストですが、難しければファイルにタイトルのみで充分です。 よろしくお願いいたします。 ファイルはもちろんGoogleドライブに入っています。 プロセスの秒数制限に引っかかるとかあったな 1000件くらいなら問題無いか ファイル名はgasで取得するよりローカルで取得するのが楽なのでは ありがとうございます。ローカルというとWindows側での操作ですね。調べてみます。 他にもGoogleフォームでタイトルが違うだけのものを100くらい作らないといけません。 質問ばかりですみませんこの件で消えますので read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる