An error occurred while uploading adjustments.
I am asking this question because I would like to resolve the error.
I tried to upload the adjustment by referring to the article at the URL 
below.

https://developers.google.com/google-ads/api/docs/conversions/upload-adjustments?hl=ja

When I tried to upload, the following error message was output.
Error Message: 'The conversion action specified in the adjustment request 
cannot be found. Make sure it's available in this account., at 
conversion_adjustments[0].conversion_action'.

Environment
 TimeZone: Asia/Tokyo
 Language:PHP 8.0.30
 Framework:Laravel 8.75
 Google Ads API : V15
 RDB : Mysql 8.0.34

The actual code is as follows.

-------------------- START --------------------

namespace App\Console\Commands;

use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Http\File;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Doctrine\Instantiator\Exception\UnexpectedValueException;
use GetOpt\GetOpt;
use Google\ApiCore\ApiException;
use Google\Ads\GoogleAds\Examples\Utils\ArgumentNames;
use Google\Ads\GoogleAds\Examples\Utils\ArgumentParser;
use Google\Ads\GoogleAds\V15\Errors\GoogleAdsError;
use Google\Ads\GoogleAds\V15\Services\UploadClickConversionsResponse;

use Google\Ads\GoogleAds\Lib\OAuth2TokenBuilder;
use Google\Ads\GoogleAds\Lib\V15\GoogleAdsClient;
use Google\Ads\GoogleAds\Lib\V15\GoogleAdsClientBuilder;
use Google\Ads\GoogleAds\Util\V15\ResourceNames;
use Google\Ads\GoogleAds\V15\Services\ClickConversion;
use Google\Ads\GoogleAds\V15\Services\ClickConversionResult;
use Google\Ads\GoogleAds\V15\Services\ConversionAdjustment;
use Google\Ads\GoogleAds\V15\Services\ConversionAdjustmentResult;
use Google\Ads\GoogleAds\V15\Services\GclidDateTimePair;
use Google\Ads\GoogleAds\V15\Services\RestatementValue;
use 
Google\Ads\GoogleAds\V15\Enums\ConversionAdjustmentTypeEnum\ConversionAdjustmentType;
use Google\Ads\GoogleAds\V15\Services\CustomVariable;

use App\Models\Evaluation;
use App\Models\ReferSite;
use App\Models\ConversionAction;

use App\Services\ChatWorkService;

class GoogleCooperationCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:googleCooperation';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Google API Collaboration';

    /**
     * MCC Account ID
     *
     * @var [type]
     */
    protected $customer_id = null;
    protected $alert_message_header = null;
    protected $alert_messages = [];
    protected $execute_count = 0;
    protected $success_count = 0;
    protected $new_count = 0;
    protected $adjust_count = 0;


    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
        $this->customer_id = config('app.google.customer_id');
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $now_date = Carbon::now()->format("Y-m-d H:i:s");
        $dial_ids = ReferSite::where('start_date', '<=', $now_date)
                    ->where('end_date', '>=', $now_date)
                    ->pluck('dial_id')
                    ->toArray();
        $dial_ids = array_unique($dial_ids);

        $from_date = Carbon::now()->format("Y-m-d") . " 00:00:00";
        $dist_date = Carbon::now()->format("Y-m-d") . " 23:59:59";
        $ini_file = $this->project_root . '/google_ads_php.ini';

        $oAuth2Credential = (new OAuth2TokenBuilder())
            ->fromFile($ini_file)
            ->build();

        $this->google_ads_client = (new GoogleAdsClientBuilder())
            ->fromFile($ini_file)
            ->withOAuth2Credential($oAuth2Credential)
            ->build();

        try {
            foreach($dial_ids as $dial_id) {
$this->alert_message_header = "";
$this->alert_messages = [];
$this->execute_count = 0;
$this->success_count = 0;
$this->new_count = 0;
$this->adjust_count = 0;
                $refer_site = ReferSite::where('dial_id', '=', 
$dial_id)->first();
                $this->alert_message_header = "GOOGLE 
{$refer_site->site_name}[ID:{$refer_site->dial_id}]";

                $new_evaluation_ids = Evaluation::where('dial_id', '=', 
$dial_id)
                                        ->where('import_count', '=', 0)
                                        ->whereIn('source', ['google_ads', 
'google_adwords', 'google_p_max'])
                                        ->pluck("id")->toArray(); // 
 期間指定はいらない?
                $adjustment_evaluation_ids_org = 
Evaluation::where('dial_id', '=', $dial_id)
                                                    ->where('import_count', 
'>', 0)
                                                    ->where('value', '>', 0)
                                                    ->whereIn('source', 
['google_ads', 'google_adwords', 'google_p_max'])
                                                    
->whereBetween('updated_at', [$from_date, $dist_date])
                                                    
->pluck("id")->toArray();

                $adjustment_evaluation_ids = [];

                foreach($adjustment_evaluation_ids_org as 
$adjustment_evaluation_id) {
                    if(!in_array($adjustment_evaluation_id, 
$new_evaluation_ids)) $adjustment_evaluation_ids[] = 
$adjustment_evaluation_id;
                }

                $new_evaluations = Evaluation::whereIn('id', 
$new_evaluation_ids)->get();
                $adjustment_evaluations = Evaluation::whereIn('id', 
$adjustment_evaluation_ids)->get();

                if(count($new_evaluations) > 0) {
                    $this->upload($new_evaluations, "new");
                }
                if(count($adjustment_evaluations) > 0) {
                    $this->upload($adjustment_evaluations, "adjustment");
                }
                $this->sendAlert();
            }
        } catch (\Throwable $th) {
            \Log::debug("GoogleCooperationCommand::handle() Error:" . 
$th->getMessage());
        }

        return 0;
    }

    /**
     * Collaboration API
     *
     * @param [type] $evaluations
     * @param [type] $type
     * @return void
     */
    public function upload($evaluations, $type)
    {
        try {
            if(count($evaluations) == 0) return;

            foreach($evaluations as $evaluation) {
$this->execute_count++;
                //  調整日時
                $dt = new Carbon($evaluation->updated_at);
                $adjustment_date = $dt->format("Y-m-d H:i:s+09:00");
                //  コンバーションアクションID取得
                $conversion_action_id = 
$this->getConversionActionId($evaluation);
                $dt = new Carbon($evaluation->conversion_date);
                $conversion_date = $dt->format("Y-m-d H:i:s+09:00");

                switch ($evaluation->clid_name) {
                    case 'gclid':
                        switch ($type) {
                            case 'new':
                                $this->datumImportNew(
                                    $conversion_action_id,
                                    $evaluation->clid,
                                    null,
                                    null,
                                    null,
                                    $conversion_date,
                                    $evaluation->value,
                                    null,
                                    $evaluation->value
                                );
                                break;
                            case 'adjustment':
                            default:
                                $this->datumImportAdjust(
                                    $conversion_action_id,
                                    $evaluation->clid,
                                    'RESTATEMENT',
                                    $conversion_date,
                                    $adjustment_date,
                                    $evaluation->value
                                );
                                break;
                        }
                        break;
                    case 'gbraid':
                        switch ($type) {
                            case 'new':
                                $this->datumImportNew(
                                    $conversion_action_id,
                                    null,
                                    $evaluation->clid,
                                    null,
                                    null,
                                    $conversion_date,
                                    $evaluation->value,
                                    null,
                                    $evaluation->value
                                );
                                break;
                            case 'adjustment':
                            default:
                                $this->datumImportAdjust(
                                    $conversion_action_id,
                                    $evaluation->clid,
                                    'RESTATEMENT',
                                    $conversion_date,
                                    $adjustment_date,
                                    $evaluation->value
                                );
                                break;
                        }
                        break;
                    case 'wbraid':
                    default:
                        switch ($type) {
                            case 'new':
                                $this->datumImportNew(
                                    $conversion_action_id,
                                    $evaluation->clid,
                                    null,
                                    null,
                                    null,
                                    $conversion_date,
                                    $evaluation->value,
                                    null,
                                    $evaluation->value
                                );
                                break;
                            case 'adjustment':
                            default:
                                $this->datumImportAdjust(
                                    $conversion_action_id,
                                    $evaluation->clid,
                                    'RESTATEMENT',
                                    $conversion_date,
                                    $adjustment_date,
                                    $evaluation->value
                                );
                                break;
                        }
                        break;
                }
                $evaluation->import_count++;
                $evaluation->save();
            }
            return;
        } catch (\Throwable $th) {
            \Log::debug("GoogleCooperationCommand::upload() Error:" . 
$th->getMessage());
            throw $th;
            return;
        }
    }

    /**
     * Conversion Adjustment
     *
     * @param integer $conversion_action_id
     * @param string $gclid
     * @param string $adjustment_type
     * @param string $conversion_date_time
     * @param string $adjustment_date_time
     * @param float $restatement_value
     * @return void
     */
    public function datumImportAdjust(
        int $conversion_action_id,
        string $gclid,
        string $adjustment_type,
        string $conversion_date_time,
        string $adjustment_date_time,
        float $restatement_value
    ) {
        ini_set('memory_limit', '1024M');
        $debug_mesage = "";
        try {
            $conversionadjustment_type = 
ConversionAdjustmentType::value($adjustment_type);

            // Associates conversion adjustments with the existing 
conversion action.
            // The GCLID should have been uploaded before with a conversion.
            $conversionAdjustment = new ConversionAdjustment([
                'conversion_action'      => 
ResourceNames::forConversionAction($this->customer_id, 
$conversion_action_id),
                'adjustment_type'        => $conversionadjustment_type,
                'gclid_date_time_pair'   => new GclidDateTimePair([
                    'gclid'                  => $gclid,
                    'conversion_date_time'   => $conversion_date_time
                ]),
                'adjustment_date_time'   => $adjustment_date_time
            ]);

            // Sets adjusted value for adjustment type RESTATEMENT.
            if (
                $restatement_value !== null
                && $conversionadjustment_type === 
ConversionAdjustmentType::RESTATEMENT
            ) {
                $conversionAdjustment->setRestatementValue(new 
RestatementValue([
                    'adjusted_value' => $restatement_value
                ]));
            }

            // Issues a request to upload the conversion adjustment.
            $conversionAdjustmentUploadServiceClient = 
$this->google_ads_client->getConversionAdjustmentUploadServiceClient();

            $response = 
$conversionAdjustmentUploadServiceClient->uploadConversionAdjustments($this->customer_id,
 
[$conversionAdjustment], true, []);

            // Prints the status message if any partial failure error is 
returned.
            // Note: The details of each partial failure error are not 
printed here, you can refer to
            // the example HandlePartialFailure.php to learn more.
            if ($response->hasPartialFailureError()) {
                $debug_mesage = sprintf(
                    "A partial failure has occurred: '%s'.%s",
                    $response->getPartialFailureError()->getMessage(),
                    PHP_EOL
                );
                $this->alert_messages[] = $debug_mesage;
            } else {
                // Prints the result if exists.
                /** @var ConversionAdjustmentResult 
$uploadedConversionAdjustment */
                $uploadedConversionAdjustment = $response->getResults()[0];
                $debug_mesage = sprintf(
                    "Conversion adjustments uploaded  [%s] Google Click ID 
'%s'.%s",
                    $uploadedConversionAdjustment->getConversionAction(),
                    
$uploadedConversionAdjustment->getGclidDateTimePair()->getGclid(),
                    PHP_EOL
                );
$this->success_count++;
$this->adjust_count++;
            }
        } catch (\Throwable $th) {
            \Log::debug("GoogleCooperationCommand::datumImportAdjust() 
Error:" . $th->getMessage());
$this->alert_messages[] = $th->getMessage() . "\n";
            throw $th;
        }
    }

    /**
     * sendAlert()
     *
     * @return void
     */
    public function sendAlert()
    {
        try {
if($this->execute_count > 0){
$chatGroupId = config('app.alert_group_id');

$users = [
['id' => xxxxxxx, 'name' => 'User1'],
['id' => xxxxxxx, 'name' => 'User2'],
['id' => xxxxxxx, 'name' => 'User3'],
];

$chat_body = "";
foreach($users as $user){
$chat_body .= "[To:{$user['id']}]{$user['name']}さん\n";
}

$chat_body .= $this->alert_message_header . "\n";
$chat_body .= "合計:" . $this->success_count . " / " . $this->execute_count . 
" 件\n";
$chat_body .= "新規:" . $this->new_count . " 件\n";
$chat_body .= "調整:" . $this->adjust_count . " 件\n";
if(count($this->alert_messages) > 0){
$chat_body .= "[hr][code]";
$chat_body .= implode("", $this->alert_messages);
$chat_body .= "[/code]";
}

$chat_body = "[info]{$chat_body}[/info]";

$chat_result = ChatWorkService::sendMessageChat($chatGroupId, $chat_body);
if(empty($chat_result)){
$success = true;
};
}
        } catch (\Throwable $th) {
            \Log::debug("GoogleCooperationCommand::sendAlert() Error:" . 
$th->getMessage());
            throw $th;
        }
    }
}
-------------------- END --------------------

-- 
-- 
=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
Also find us on our blog:
https://googleadsdeveloper.blogspot.com/
=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~

You received this message because you are subscribed to the Google
Groups "AdWords API and Google Ads API Forum" group.
To post to this group, send email to adwords-api@googlegroups.com
To unsubscribe from this group, send email to
adwords-api+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/adwords-api?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Google Ads API and AdWords API Forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to adwords-api+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/adwords-api/2bf56e43-b0a2-41f4-9e9d-e7cbc03992e6n%40googlegroups.com.
  • An... Kazumasa Sato
    • ... 'Google Ads API Forum Advisor' via Google Ads API and AdWords API Forum

Reply via email to